Discuss / Java / 请老师帮忙看一下,错在了什么地方。谢谢!

请老师帮忙看一下,错在了什么地方。谢谢!

Topic source

运行第一个MAX后,其他的运行就报错。

如果仅留任意一条比如:max; min; average....,这些语句均可以单独执行。

就是放在一起来执行,象这样就不行。查了好久,没有办法,请帮忙看看。谢谢啦老师!!

import java.util.Arrays;
import java.util.stream.IntStream;
public class Demo08 {

 public static void main(String[] args) {
  IntStream intStream = Arrays.stream(new int[] { 1,2,4,3,6,9,8,5,10,7,10 });
  //找最大值
  System.out.println("Max value: "+intStream.max());
  //找最小值
  System.out.println("Min value: "+intStream.min());
  //求和
  System.out.println("Sum: "+intStream.sum());
  //求平均数
  System.out.println("Avaerage value: "+intStream.average());
  //如果都小于20,则输出总和,否则输出“存在不符合要求的元素”
  boolean a = intStream.allMatch(x -> (x-20)<0);
  System.out.println(a ? intStream.average() : "存在不符合要求的元素" );
  //如果有一个大于20,就输出综合,否则输出“所有元素均不满足要求”
  boolean b = intStream.allMatch(x -> (x-20)>=0);
  System.out.println(b ? intStream.average():"所有元素均不满足要求" );
 }
}

运行结果为:

Min value: OptionalInt[1]

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed

 at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)

 at java.base/java.util.stream.IntPipeline.reduce(IntPipeline.java:491)

 at java.base/java.util.stream.IntPipeline.sum(IntPipeline.java:449)

 at com.zhy.demo.Demo08.main(Demo08.java:17)

所有对流的终端操作都会遍历流最终导致流管道关闭,也就是不能多次终端操作。

参见:Stream operations and pipelines

可以用IntStream.summaryStatistics()一次性终端操作获得{count, sum, min ,average, max}。

参见:Find maximum, minimum, sum and average of a list in Java 8

后面intStream.allMatch(x -> (x-20)>=0)等操作替代方法你自己再想一下办法吧。

木火应

#3 Created at ... [Delete] [Delete and Lock User]

你可以每执行一次前加***try(){}***语句

就像下面这样:

try(IntStream intStream = Arrays.stream(new int[] { 1,2,4,3,6,9,8,5,10,7,10 });){//找最大值                                System.out.println("Max value: "+intStream.max());}     
try(IntStream intStream = Arrays.stream(new int[] { 1,2,4,3,6,9,8,5,10,7,10 });){//找最小值                                 System.out.println("Min value: "+intStream.min());}

不过这样操作感觉也累赘,因为每次都需要初始化,应该有其他更简单的方法才对


  • 1

Reply