blob: 3e80b2fe7092681562ead930581de5a226dc503c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.drill.common.collections;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import com.google.common.base.Preconditions;
public class Collectors {
private Collectors() {
}
/**
*
* @param map {@code Map<K, V>} to collect elements from
* @param mapper {@code BiFunction} that maps from (key, value) pair to type <T>
* @param <T> elements type in {@code List}
* @param <K> key type in {@code Map}
* @param <V> value type in {@code Map}
* @return new {@code List} that contains elements after applying mapper {@code BiFunction} to the input {@code Map}
*/
public static <T, K, V> List<T> toList(Map<K, V> map, BiFunction<K, V, T> mapper) {
return collect(new ArrayList<>(map.size()), map, mapper);
}
/**
*
* @param map {@code Map<K, V>} to collect elements from
* @param mapper {@code BiFunction} that maps from (key, value) pair to type <T>
* @param predicate {@code Predicate} filter to apply
* @param <T> elements type in {@code List}
* @param <K> keys type in {@code Map}
* @param <V> value type in {@code Map}
* @return new {@code List} that contains elements that satisfy {@code Predicate} after applying mapper {@code BiFunction}
* to the input {@code Map}
*/
public static <T, K, V> List<T> toList(Map<K, V> map, BiFunction<K, V, T> mapper, Predicate<T> predicate) {
return collect(new ArrayList<>(map.size()), map, mapper, predicate);
}
public static <T, K, V> List<T> collect(List<T> list, Map<K, V> map, BiFunction<K, V, T> mapper) {
Preconditions.checkNotNull(list);
Preconditions.checkNotNull(map);
Preconditions.checkNotNull(mapper);
map.forEach((k, v) -> list.add(mapper.apply(k, v)));
return list;
}
public static <T, K, V> List<T> collect(List<T> list, Map<K, V> map, BiFunction<K, V, T> mapper, Predicate<T> predicate) {
Preconditions.checkNotNull(list);
Preconditions.checkNotNull(map);
Preconditions.checkNotNull(mapper);
Preconditions.checkNotNull(predicate);
map.forEach((k, v) -> {
T t = mapper.apply(k, v);
if (predicate.test(t)) {
list.add(t);
}
});
return list;
}
/**
*
* @param collection {@code Collection<E>} of elements of type <E>
* @param mapper {@code Function<E, T>} mapper function to apply
* @param <T> elements type in {@code List}
* @param <E> elements type in {@code Collection}
* @return new {@code List} that contains elements that satisfy {@code Predicate} after applying mapper {@code Function}
* to the input {@code Collection}
*/
public static <T, E> List<T> toList(Collection<E> collection, Function<E, T> mapper) {
Preconditions.checkNotNull(collection);
Preconditions.checkNotNull(mapper);
ArrayList<T> list = new ArrayList<>(collection.size());
collection.forEach(e -> list.add(mapper.apply(e)));
return list;
}
/**
*
* @param collection {@code Collection<E>} of elements of type <E>
* @param mapper {@code Function<E, T>} mapper function to apply
* @param predicate {@code Predicate} filter to apply
* @param <T> elements type in {@code List}
* @param <E> elements type in {@code Collection}
* @return new {@code List} that contains elements after applying mapper {@code Function} to the input {@code Collection}
*/
public static <T, E> List<T> toList(Collection<E> collection, Function<E, T> mapper, Predicate<T> predicate) {
Preconditions.checkNotNull(collection);
Preconditions.checkNotNull(mapper);
Preconditions.checkNotNull(predicate);
ArrayList<T> list = new ArrayList<>(collection.size());
collection.forEach(e -> {
T t = mapper.apply(e);
if (predicate.test(t)) {
list.add(t);
}
});
return list;
}
}