it-swarm.com.ru

Java 8 - Вызов метода с несколькими аргументами из Collection.stream.map ()

Я использовал потоки Java 8 некоторое время. Я столкнулся с ситуацией, когда мне нужно пройти через List и передать каждый элемент статическому методу вместе с другим аргументом. Возможно ли это в Java 8?

........
String designation = "Engineer";
List<String> names = new ArrayList<>();
names.add("ABC");
names.add("DEF");
names.add("GHI");
names.stream().map(MyClass::createReport);
..........

class MyClass {
    public static void createReport(String name, String designation) {
       System.out.println(name+"\t"+designation);
    }
}

Как я могу передать обозначение String через stream (). Map ()?

7
Prasad

Используйте лямбда-выражение:

names.stream().map(name -> MyClass.createReport(name,designation))...
6
Eran

Вы можете написать curried версию метода createReport

Карри createReport

Нам нужно поменять местами порядок аргументов, потому что designation для каждого name одинаков. Кроме того, нам просто нужно вызвать не карри метод.

Function<String, Consumer<String>> createReportCurry = (designation) -> (name) -> {
    createReport(name, designation);
};

В бою

names.stream().forEach(createReportCurry.apply(designation))
2
Roman

Приведенный выше ответ очень хорош, но давайте попробуем объяснить, почему вы не смогли запустить свой код в первую очередь:

Ваш код:

names.stream().map(MyClass::createReport);names.stream().map(MyClass::createReport);

Что предпринимает JVM

names.stream().map(MyClass::createReport);names.stream().map(name -> MyClass.createReport(name));

Решения Используйте базовую лямбу как @Eran или функцию, как предложено @Roman.

0
Herve MULUDIKI

Вы также можете использовать следующее в качестве альтернативы:

IntStream.range(0, names.size())
         .forEach(i -> MyClass.createReport(names.get(i), names.get(i)));
0
Nicholas K