2014-07-06 2 views
3

내가 Java8 람다를 통해 파고 그리고 난이 다음과 같은 문제에 직면하고있어 잘 데이터를 변경하지 않습니다 호출하려고 시도하십시오.자바 8 람다

List<Integer> l = Arrays.asList(1,2,3); 

DamnLambda.inc(l, x -> x+=1); 
System.out.println(l); //[1,2,3] ? Why not [2,3,4] ? 

왜 데이터가 변경되지 않는지 이해할 수 없습니다.

l.forEach(x -> x+1); //same thing, doesn't change the data. 

내가 여기 실종 무엇 : 또한 같은 기능의 다른 버전을 시도?

+3

루프 반복 변수에 값을 할당해도 실제로는 수행되지 않아야합니다. –

+3

함수 프로그래밍의 요점이 빠져 있습니다. 입력을 변경하지 않아도됩니다. 입력의 변형 인 출력을 생성해야합니다. –

+0

글쎄, 너희들이 날 잡았어. 나는 맹목적으로 목록에있는 람다 연산을 수행하려고 시도하고 있었고, 근본적인 규칙 중 하나를 잊어 버렸다. Btw. 코드가 컴파일됩니다. – krzakov

답변

3

변경 inc()에 : 다음

public static List<Integer> inc (List<Integer> list, Funtion<Integer,Integer> func) { 

    List<Integer> result = new ArrayList<Integer>(); 
    for(Integer intr : list) { 
     result.add(func.apply(intr)); 
    } 
    return result; 
} 

과 전화 :

l = DamnLambda.inc(l, x -> x+=1); 
8

방법에 대해 :

list.replaceAll(x -> x+1); 
+0

이전의 것보다 훨씬 낫지 만 이전에 대답으로 표시 한 것은 내가 생각한 상황을 반영했기 때문입니다. 실제로 사용 람다를 이해하려고 노력했습니다. – krzakov

+0

+1 그냥 큰 팬이라고 :-) – alfasin

4

Brian Goetz' answer가 명확하게 목록을 변이 할 경우에 사용하는 하나입니다 제자리에서. alfasin's answer이 설명하는 것처럼 보이는 대안은 수정 된 값을 포함하는 새 목록을 만드는 것입니다. 람다 및 스트림을 사용하는 방법은 다음과 같습니다.

List<Integer> result = 
    list.stream() 
     .map(i -> i + 1) 
     .collect(Collectors.toList()); 
+0

veru 유용하다고 말하고 싶습니다. 오늘 스트림을 살펴볼 예정입니다. :) – krzakov