2014-05-12 1 views
-1

Java SE 8의 다양한 측면을보고 있습니다. 컴파일 할 수있는 코드가 런타임 예외 또는 겉보기로 이어지는 여러 상황이 있습니다. 불일치. 한 구문에서 구문이 예상대로 작동하지만 다른 구문에서는 실패한 것처럼 보입니다. 벌레인가, 아니면 뭔가 빠졌는가? 0에서 시작Java SE 8 IntStream.reduce (등)가 일관성없이 작동하는 것 같습니다.

import java.util.stream.IntStream; 
import java.util.stream.LongStream; 
import java.util.stream.DoubleStream; 
import static java.lang.System.*; 

public class Stream06 { 
    public static void main(String[] args) { 
     out.println(IntStream.rangeClosed(2,5) 
      .reduce((i,j)->i+j).getAsInt());  // OK 
     out.println(IntStream.rangeClosed(2,5) 
      .reduce(0,(i,j)->i+j));     // OK 
     out.println(IntStream.rangeClosed(2,5) 
      .reduce((i,j)->i*j).getAsInt());  // OK! 
     out.println(IntStream.rangeClosed(2,5) 
      .reduce(0,(i,j)->i*j));     // zero!!! 

     out.println(); 
     out.println(LongStream.rangeClosed(2,5) 
      .reduce((l,m)->l+m).getAsLong());  // OK 
     out.println(LongStream.rangeClosed(2,5) 
      .reduce(0,(l,m)->l+m));     // OK 
     out.println(LongStream.rangeClosed(2,5) 
      .reduce((l,m)->l*m).getAsLong());  // OK! 
     out.println(LongStream.rangeClosed(2,5) 
      .reduce(0,(l,m)->l*m));     // zero!!! 

     out.println(); 
     out.println(DoubleStream.of(2.5, 1.3, 6.8) 
      .reduce((d,e)->d+e).getAsDouble());  // OK 
     out.println(DoubleStream.of(2.5, 1.3, 6.8) 
      .reduce(0,(d,e)->d+e));     // OK 
     out.println(DoubleStream.of(2.5, 1.3, 6.8) 
      .reduce((d,e)->d*e).getAsDouble());  // OK (usual rounding issue) 
     out.println(DoubleStream.of(2.5, 1.3, 6.8) 
      .reduce(0,(d,e)->d*e));     // zero!!! 
    } 
} 
+4

:-) 예상됩니다 /8/docs/api/java/util/stream/IntStream.html#reduce-int-java.util.function.IntBinaryOperator-) : * 'identity'값은 누산기 함수의 ID 여야합니다. * 읽고 읽었습니까? 그 문장을 이해하니? 곱셈의 아이덴티티는 '0'이 아니라 '1'입니다. – Holger

+0

@ user3627702 어떤 런타임 예외가 발생 했습니까? 제로 결과를 얻는 것에 관해서, 다른 사람들은 곱셈에 대한 감축의 "동일성"값으로 0을 사용한다면 그것이 예상됨을 지적했습니다. 이것을 이해하지 못한다면 어쩌면 그 용어로 질문을 재 작성해야합니다. 나는 이것이 관련 주제에 관한 질문이라고 생각합니다. –

+0

런타임 예외는 하나 이상의 컨텍스트 (예 : ZonedDateTime.from (anInstant))에서 .from (TemporalAccessor)를 사용하여 설명서를 읽는 중 효과가 있음을 나타냅니다. – user3627702

답변

3

감소 i*j가 제로에 이르게 ... 음, 꽤 http://docs.oracle.com/javase ([`IntStream.reduce`에 대한 문서]

관련 문제