在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ java8 stream reduce問題

java8 stream reduce問題

reduce方法有三個override的方法:

Optional<T> reduce(BinaryOperator<T> accumulator);
T reduce(T identity, BinaryOperator<T> accumulator);
<U> U reduce(U identity,BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner);

想請問一下reduce的返回值是不是必須是List泛型的類型啊?比如能不能把List<ObjectA> objects;
objects.stream.reduce();
返回值必須是ObjectA類型嗎?不能是返回一個比如ObjectA的屬性相加的值嗎?如果ObjectA有一個int類型的字段,我想返回這個字段累計的值

回答
編輯回答
女流氓

從題主的問題可以看出來,ObjectA不是stream的最終返回數(shù)據(jù),最終返回的數(shù)據(jù)是ObjectA中的一個屬性或者是屬性的相關(guān)計算結(jié)果吧,那這就很符合題主貼的第三個方法嘛,最終返回的類型是泛型U,不是T,這個方法的三個參數(shù)代表意思是:

  1. U identity,這個T類型流是空流的時候,返回的默認(rèn)值
  2. BiFunction<U, ? super T, U> accumulator,一個U和一個T如何轉(zhuǎn)化為一個U
  3. BinaryOperator<U> combiner,兩個U是如何合并成一個U

轉(zhuǎn)化為題主這個題目就變成這個樣子了(由于這里是基于對象操作,建議題主把ObjectA中的屬性改裝成包裝類Integer)

  1. Integer identity,返回默認(rèn)的Integer
  2. BiFunction<Integer, ? super ObjectA, Integer> accumulator,一個Integer和一個ObjectA如何轉(zhuǎn)化為一個Integer
  3. BinaryOperator<Integer> combiner,兩個Integer是如何合并成一個Integer

結(jié)合以前我回答對于reduce方法的理解https://segmentfault.com/q/10...

就可以簡單寫出這樣的代碼了

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ObjectA {

    private Integer score;
}

測試類:

Integer reduce = Arrays.asList(o, o1, o2).stream().reduce(Integer.valueOf(0), ((integer, objectA) -> Integer.sum(integer, objectA.getScore())), Integer::sum);

如果你是需要ObjectA中多個屬性進行累加或者其他操作,你可以在第二個參數(shù)里修改

Integer reduce = Arrays.asList(o, o1, o2).stream().reduce(Integer.valueOf(0), integer.intValue() + objectA.getScore1().intValue() + objectA.getScore2().intValue()), Integer::sum);

總之都是可以的,不過不太建議直接這么改,建議把業(yè)務(wù)需要返回的值封裝起來,而不是直接在這里改來改去,就直接把objectA.getScore1().intValue() + objectA.getScore2().intValue()封裝成一個objectA.getXXX()方法來返回你的計算結(jié)果吧,以上僅供參考

2018年7月24日 15:29
編輯回答
朕略傻

單純算加法的話,直接mapToInt接一個sum就行了

2018年7月13日 01:43