jdk8
stream创建/中间操作/终止操作api
public static void main(String[] args) {
//流的创建:可以通过Array/List/Set的stream(),或Stream类的静态方法builder/generate/of等方法
Lists.newArrayList(1,2,3).stream().forEach(System.out::println);
System.out.println(Stream.builder().add(1).add(2).add(3).build().collect(Collectors.toList()));
System.out.println(Stream.iterate(1, i -> ++i).limit(3).collect(Collectors.toList()));//无限流,seed种子,必须limit否则0
Stream.generate(() -> Math.random()).limit(3).forEachOrdered(System.out::println);//::是对拉姆达的进一步简化
//流的中间操作:包括filter/distinct/sorted/unordered/skip/limit/peek/map/flatmap等,返回仍是流(必须有终止操作否则中间步骤不执行,parallelStream多核CPU并行操作流排序无效)
System.out.println(Lists.newArrayList(1, 3, 3, 2, 4, 5, 8, 7, 6).stream().filter(i -> {System.out.println(i);return i != 1;}).distinct().sorted((o1, o2) -> o1 - o2).skip(1).limit(3).map(o -> ++o).collect(Collectors.toList()));
System.out.println(Arrays.asList("aa", "bb", "cc", "dd").stream().peek(s -> System.out.println(s)).collect(Collectors.toList()));//peek用于debug,类似map,但无返回
Stream.of("a,a", "b,b", "c,c", "d,d").flatMap(s ->Stream.of(s.split(","))).forEach(ss -> System.out.println(ss));//flat返回的是流,这些流合并为一个整体流
Stream.of("a,a", "b,b", "c,c", "d,d,d").map(s ->s.split(",")).forEach(arr -> {System.out.println(arr.length); });//map返回的是基本数据类型
//流的终止:如非collect/toArray/count/forEach/allMatch/anyMatch/nonMatch/findAny/findFirst/max/min/reduce
System.out.println(Stream.of("aa", "bb", "cc", "dd").allMatch(Objects::nonNull));
System.out.println(Stream.of("aa", "bb", "cc", null).anyMatch(s -> StringUtils.isBlank(s)));
System.out.println(Stream.of("aa", "bb", "cc", null).findFirst().get());
System.out.println(Stream.of("aa", "bb", "cc", null).map(s -> {System.out.println(s);return s;}).reduce((str1, str2) -> str1 + str2).get());//聚合操作,类似递归,如(((e1+e2)+e3)+e4)
System.out.println(Stream.of("aa", "bb", "cc", null).map(s ->s+=s).reduce("initVal",(str1, str2) -> str1 + str2));//指定初始值
//流的终止:特别的统计API
List<Goods> goods = Lists.newArrayList(
new Goods("商品1", 1, 1),
new Goods("商品2", 2, 2),
new Goods("商品3", 3, 3));
Double totalPrice = goods.stream().map(item -> item.getPrice() * item.getNum()).reduce((p1, p2) -> p1 + p2).get();
System.out.println(totalPrice);//14元
DoubleSummaryStatistics statistics = goods.stream().mapToDouble(item -> item.getPrice() * item.getNum()).summaryStatistics();
System.out.println("商品种数:"+statistics.getCount());
System.out.println("最高花费:"+statistics.getMax());
System.out.println("平均花费:"+statistics.getAverage());
System.out.println("总花费:"+statistics.getSum());//14元
}
并行stream API的适用场景测试
public class Test {
public static void main(String[] args) throws Exception {
//准备一个数据源集合,测试将集合元素拼接一个字符放入另一个集合
ArrayList<String> resourceList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
resourceList.add(i + "");
}
//普通处理。。。。。。。。。。。。。。。。。。。。。。。。。。。
long t1 = System.currentTimeMillis();
ArrayList<String> s1 = new ArrayList<>();
for (String s : resourceList) {
Thread.sleep(500);//模拟此处有0.5s的其它操作
s1.add(s + "普通测试");
}
long t2 = System.currentTimeMillis();
//JKD8 parallelStream处理。。。。。。。。。。。。。。。。。。。
long t3 = System.currentTimeMillis();
List<String> s2 = resourceList.parallelStream().map(e -> {
try {
Thread.sleep(500);//模拟此处有0.5s的其它操作
} catch (InterruptedException e1) {
e1.printStackTrace();
}
return e + "Stream测试";
}).collect(Collectors.toList());
long t4 = System.currentTimeMillis();
System.out.println(t2 - t1);
System.out.println(t4 - t3);
//结论:1.多次测量输出:5000:1500;
// 2.当业务的集合迭代处理过程中有较耗时操作时,利用多核CPU及JDK8 并行api,能明显提升效率;
// 3.简单集合迭代,无耗时操作不推荐stream
}