亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java流中的中間操作

Java流中的中間操作

鴻蒙傳說 2022-06-04 15:42:59
在 java 8 中,我使用 Streams 打印輸出,但大小為 0。為什么?public class IntermediateryAndFinal {    public static void main(String[] args) {        Stream<String> stream = Stream.of("one", "two", "three", "four", "five");        Predicate<String> p1 = Predicate.isEqual("two");        Predicate<String> p2 = Predicate.isEqual("three");        List<String> list = new ArrayList<>();        stream.peek(System.out::println)            .filter(p1.or(p2))            .peek(list::add);        System.out.println("Size = "+list.size());    }}
查看完整描述

4 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

理想情況下,您不應該改變外部列表,而是可以使用Collectors.toList()將其收集到列表中:


List<String> list = stream.peek(System.out::println)

            .filter(p1.or(p2))

            .collect(Collectors.toList()); // triggers the evaluation of the stream

System.out.println("Size = "+list.size());

在您的示例中,僅當終端操作像


allMatch()

anyMatch() 

noneMatch() 

collect() 

count() 

forEach() 

min() 

max() 

reduce()


查看完整回答
反對 回復 2022-06-04
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

由于您還沒有完成流操作,即peek是一個中間操作。您必須使用終端操作才能繼續執行。


建議:改為使用終端操作執行此類操作,例如collect


List<String> list = stream.peek(System.out::println)

        .filter(p1.or(p2))

        .collect(Collectors.toList());

另外:添加一個peek帖子filter來觀察值在觀察中可能有點棘手,如下代碼


List<String> list = stream.peek(System.out::println)

        .filter(p1.or(p2))

        .peek(System.out::println) // addition

        .collect(Collectors.toList());

輸出看起來像:


one

two

two // filtered in

three

three // filtered in

four

five


查看完整回答
反對 回復 2022-06-04
?
溫溫醬

TA貢獻1752條經驗 獲得超4個贊

溪流是懶惰的。您可以調用終端操作,例如forEach

stream.peek(System.out::println)
      .filter(p1.or(p2))
      .forEach(list::add);

如果您想peek用作調試目的的中間操作,那么您必須在之后調用終端操作:

stream.peek(System.out::println)
      .filter(p1.or(p2))
      .peek(list::add);
      .<any terminal operation here>();

順便說一句,如果您只想將所有過濾后的值存儲在一個列表中,那么最好使用collect(toList()).


查看完整回答
反對 回復 2022-06-04
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

您所做的一切filter都是peek設置一系列操作以應用于流。您實際上還沒有使它們中的任何一個運行。您必須添加一個終端操作,例如count. (另一個答案建議使用forEach添加到列表中,但我認為您專門嘗試使用中間操作peek。)



查看完整回答
反對 回復 2022-06-04
  • 4 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號