2016-11-09 4 views
3

Хорошо, это не вопрос домашней работы, это «я получаю с программой Java 8 и надеюсь в конечном итоге пройти сертификационный экзамен».Java 8 Stream Сокращение произвольного класса Тип

Я пытаюсь вычислить метод reduce() с точки зрения сокращения списка произвольного класса (а не всего кода примера, который я вижу), для одного члена моего кода.

package playground; 

import java.util.Arrays; 
import java.util.List; 

public class TestClass { 

public static class MyClass { 

    private int accumulator = 0; 

    public MyClass() { 

    } 

    public MyClass(int initValue) { 
     this.accumulator = initValue; 
    } 

    public int getAccumulator() { 
     return accumulator; 
    } 

    public void setAccumulator(int accumulator) { 
     this.accumulator = accumulator; 
    } 


} 

public static void main(String... args) { 

    MyClass mc1 = new MyClass(6); 
    MyClass mc2 = new MyClass(8); 
    MyClass mc3 = new MyClass(3); 

    List<MyClass> myList = Arrays.asList(mc1, mc2, mc3); 
    MyClass finalClass = myList.stream().reduce(new MyClass(0), 
     // need the correct lambda function here 
    ); 


} 

}

+0

Вы бы нужно что-то, продиктовать бы как два 'MyClass' экземпляры объединены. – Rogue

+0

Вот о чем я прошу о помощи. Лямбда-функции новы для меня, и я пытаюсь научиться их использовать. – Jason

+3

'(m1, m2) -> new MyClass (m1.getAccumulator() + m2.getAccumulator())' – Spotted

ответ

7

что-то к эффекту:

MyClass finalClass = myList.stream() 
    .reduce((a, b) -> new MyClass(a.accumulator + b.accumulator)) 
    .orElse(new MyClass(0)); 

Это занимает 2 вход, которые должны быть заключена в круглых скобках, и сводит их к одному выходу. Обратите внимание, что это возвращает Optional.

простой способ справиться с этим с OrElse что эквивалентно:

if(myList.size() == 0){ 
    return new MyClass(0); 
} 
+0

Хорошо, что возвращает Необязательный , но в остальном это хорошо. Я смотрел на другие подписи с BiFunction и BinaryOperator и не мог понять. – Jason

+1

@Jason обратите внимание на операцию 'orElse'' Stream' после 'reduce', это позволяет обрабатывать необязательно изящно. Вы просто попадете в 'orElse', если исходный' List' пуст. Это дает возвращаемый тип 'MyClass'. – JynXXedRabbitFoot

+0

Правильно, я вижу это. К сожалению, я долго ждал и не мог изменить свой оригинальный комментарий. – Jason

Смежные вопросы