IT 서적/모던 자바 인 액션

모던 자바 인 액션 Chapter 6

수달하나 2023. 7. 15. 01:10

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);
    }
}