可能的Java1.8流异常

时间:2014-11-20 17:26:00

标签: java java-8 java-stream

有人可以解释以下代码的行为吗?特别是为什么流中的forEach会更改原始List?:

import java.util.ArrayList;
import java.util.List;

public class foreachIssue {
        class justanInt {   
        public int anint; 
        public justanInt(int t){
            anint=t;
        }
    }

    public static void main(String[] args){
        new foreachIssue();
    }
    public foreachIssue(){
        System.out.println("The Stream Output:"); 
        List<justanInt> lst = new ArrayList<>();
        justanInt j1=new justanInt(2);
        justanInt j2=new justanInt(5);
        lst.add(j1);lst.add(j2);
        lst.stream()
                .map((s)->{
                    s.anint=s.anint*s.anint;
                    return s;
                })
                .forEach((s)->System.out.println("Anything"));
        System.out.println(" lst after the stream:"); 
        for(justanInt il:lst)
            System.out.println(il.anint); 

        List<justanInt> lst1 = new ArrayList<>();
        justanInt j3=new justanInt(2);
        justanInt j4=new justanInt(5);
        lst1.add(j3);lst1.add(j4);
        lst1.stream()
                    .map((s)->{
                    s.anint=s.anint*s.anint;
                    return s;
                });
        System.out.println(" lst1 after the stream without forEach:"); 
        for(justanInt il:lst1)
            System.out.println(il.anint); 
    }
}

输出结果为:

流输出:

任何

任何

在流之后:

4

25

在没有forEach的流之后

lst1:

2

5

1 个答案:

答案 0 :(得分:5)

mapintermediate operation

  

流操作分为中间(流生成)   操作和终端(产生价值或副作用)操作。   中级操作总是很懒惰。

因此,在您使用Function之前,您提供给map的{​​{1}}不会被应用。在第一种情况下,您使用forEach执行此操作,这是一个终端操作。在第二个,你没有。