1. reverse 구현
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream()
.collect(new ReverseCollector<>());
System.out.println(result); // [5, 4, 3, 2, 1]
}
public class ReverseCollector<T> implements Collector<T, List<T>, List<T>> {
@Override
public Supplier<List<T>> supplier() {
return ArrayList::new;
}
@Override
public BiConsumer<List<T>, T> accumulator() {
return List::add;
}
@Override
public BinaryOperator<List<T>> combiner() {
return null;
}
@Override
public Function<List<T>, List<T>> finisher() {
return list -> {
Collections.reverse(list);
return list;
};
}
@Override
public Set<Characteristics> characteristics() {
return EnumSet.noneOf(Characteristics.class);
}
}
2. String concat 구현
public static void main(String[] args) {
List<String> words = Arrays.asList("Hello", " ", "world", "!");
String result = words.stream()
.collect(new StringConcatCollector());
System.out.println(result); // Hello world!
}
public class StringConcatCollector implements Collector<String, StringBuilder, String> {
@Override
public Supplier<StringBuilder> supplier() {
return StringBuilder::new;
}
@Override
public BiConsumer<StringBuilder, String> accumulator() {
return StringBuilder::append;
}
@Override
public BinaryOperator<StringBuilder> combiner() {
return null;
}
@Override
public Function<StringBuilder, String> finisher() {
return StringBuilder::toString;
}
@Override
public Set<Characteristics> characteristics() {
return EnumSet.noneOf(Characteristics.class);
}
}
3. 홀짝 분리
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Map<Boolean, List<Integer>> result = numbers.stream()
.collect(new EvenOddPartitionCollector<>());
List<Integer> evens = result.get(true);
List<Integer> odds = result.get(false);
System.out.println("Evens: " + evens); // Evens: [2, 4, 6, 8, 10]
System.out.println("Odds: " + odds); // Odds: [1, 3, 5, 7, 9]
}
public class EvenOddPartitionCollector implements Collector<Integer, Map<Boolean, List<Integer>> ,Map<Boolean, List<Integer>>> {
@Override
public Supplier<Map<Boolean, List<Integer>>> supplier() {
return () ->{
Map<Boolean, List<Integer>> res = new HashMap<>();
res.put(true, new ArrayList<>());
res.put(false, new ArrayList<>());
return res;
};
}
@Override
public BiConsumer<Map<Boolean, List<Integer>>, Integer> accumulator() {
return (booleanListMap, integer) -> {
Boolean flag = integer%2==0 ? true : false;
booleanListMap.get(flag).add(integer);
};
}
@Override
public BinaryOperator<Map<Boolean, List<Integer>>> combiner() {
return null;
}
@Override
public Function<Map<Boolean, List<Integer>>, Map<Boolean, List<Integer>>> finisher() {
return Function.identity();
}
@Override
public Set<Characteristics> characteristics() {
return EnumSet.noneOf(Characteristics.class);
}
}