Java потоков - я должен использовать уменьшить или собрать? - PullRequest
1 голос
/ 07 марта 2020

Я использую Java 9. Я узнаю о таких операциях Stream, как collect () и lower () из этого урока от Baeldung, т.е. EUGEN PARASCHIV.

Я должен перечислить все имена сотрудников, разделенные запятой. Учебник использует collect () для этого. Но я могу сделать это с помощью Redu () и Collect (). Я видел несколько примеров, которые используют коллекцию только для помещения элементов в коллекцию, такую ​​как List. Итак, как я могу узнать, когда использовать Reduce () или Collect ()?

private static Employee[] arrayOfEmps = {
        new Employee(1, "Jeff Bezos", 100000.0),
        new Employee(2, "Bill Gates", 200000.0),
        new Employee(3, "Mark Zuckerberg", 300000.0)
};


public static void joiningDemo(){
    //List all the employee names separated by a comma.
    String fromReduce = empList.stream().map(Employee::getName).reduce("", (allNames, oneName) ->  allNames + ", " + oneName);
    fromReduce = fromReduce.substring(2);    
    String fromCollect = empList.stream().map(Employee::getName).collect(Collectors.joining(", "));

    System.out.println("reduce : " + fromReduce);
    System.out.println("collect : " + fromCollect);
}

ВЫХОД:

reduce : Jeff Bezos, Bill Gates, Mark Zuckerberg
collect : Jeff Bezos, Bill Gates, Mark Zuckerberg

Ответы [ 3 ]

1 голос
/ 07 марта 2020

Collectors.joining(", ") - это, по сути, сокращение - все элементы слиты воедино в одно значение - но он придерживается контракта коллектора, потому что он сохраняет свое собственное состояние.

Хотя было бы полезно для вас реализовать как сокращение, я бы использовал Collectors.joining (), потому что 99% кода написано для вас.

1 голос
/ 07 марта 2020

Если вы можете выбрать любой, используйте collect(). Ваш пример хороший, типичный для простоты, ясности и правильности, который тщательно разработанный и хорошо протестированный Collector приводит к распространенным случаям использования.

0 голосов
/ 08 марта 2020

Если вы хотите неизменное сокращение, вам следует использовать reduce() или collect() для изменяемого сокращения.

Для получения более подробной информации смотрите видео.

https://www.youtube.com/watch?v=H7VbRz9aj7c

...