测试数据:
private static List<String> getList() {
List<String> list = new ArrayList<>();
list.add("a1");
list.add("a2");
list.add("a3");
list.add("a4");
list.add("b1");
list.add("b2");
list.add("b3");
list.add("b4");
return list;
}
private static List<String> getList2() {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
return list;
}
1、迭代:
List<String> list = getList();
//Java8之前的迭代
for (String s : list) {
System.out.println(s);
}
//Stream API的迭代
list.forEach(System.out::println);
2、过滤某些元素:
#
//过滤掉不以a开头的字符串
List<String> list = getList();
for (Iterator<String> i = list.iterator();i.hasNext();) {
String s = i.next();
if(!s.startsWith("a"))
i.remove();
}
System.out.println(list);
//Stream API
List<String> list2 = getList();
list2 = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
System.out.println(list2);
3、转换:
//String 转换成 Integer
List<String> list = getList2();
List<Integer> list2 = new ArrayList<>();
for (String s : list) {
list2.add(Integer.valueOf(s));
}
System.out.println(list2);
//Stream API
List<String> list3 = getList2();
List<Integer> list4 = list3.stream().map(Integer :: valueOf).collect(Collectors.toList());
System.out.println(list4);
4、几个简单的聚合方法:
//聚合方法
List<String> list = getList();
List<String> list2 = getList2();
//最大值
Optional<String> max = list2.stream().max(String :: compareTo);
System.out.println(max.get());
//最小值
Optional<String> min = list2.stream().min(String :: compareTo);
System.out.println(min.get());
//找到第一个以a开头的元素
Optional<String> first = list.stream().filter(s -> s.startsWith("a")).findFirst();
System.out.println(first.get());
//查找一个以a开头的元素(不是按顺序查找),parallelStream是并行执行计算的流
Optional<String> findAny = list.parallelStream().filter(s -> s.startsWith("a")).findAny();
System.out.println(findAny.get());
//查找是否存在以a开头的元素
boolean anyMatch = list.parallelStream().anyMatch(s -> s.startsWith("a"));
System.out.println(anyMatch);
//是否每个元素都是以a开头
boolean allMatch = list.parallelStream().allMatch(s -> s.startsWith("a"));
System.out.println(allMatch);
//是否每个元素都不是以c开头
boolean noneMatch = list.parallelStream().noneMatch(s -> s.startsWith("c"));
System.out.println(noneMatch);
上面大部分操作都返回一个Optional类,下面介绍
5、Optional的基本用法:
//Optional的基本用法
List<String> list = getList();
Optional<String> findAny = list.parallelStream().filter(s -> s.startsWith("a")).findAny();
//1、显示判断,如果存在符合条件的元素,则取出来打印(个人不常用)
if(findAny.isPresent()){
System.out.println(findAny.get());
}
//2、如果存在符合条件的元素,则取出来打印,如果不存在,则什么都不做
findAny.ifPresent(System.out::println);
Optional<String> findAny2 = list.parallelStream().filter(s -> s.startsWith("c")).findAny();
//3、如果不存在符合条件的元素,则用""代替
System.out.println(findAny2.orElse(""));
//4、如果不存在符合条件的元素,则用计算的结果代替
String orElseGet = findAny2.orElseGet(() ->{
if(System.currentTimeMillis() % 2 == 0)
return "a99";
return "";
});
System.out.println(orElseGet);
//5、如果不存在符合条件的元素,则抛出异常
findAny2.orElseThrow(RuntimeException :: new);
6、收集:
#
//收集,把结果收集组合成MAP
List<String> list = getList();
Map<String, Integer> collect = list.stream().collect(Collectors.toMap(s -> s, s -> s.length()));
System.out.println(collect);
7、并行流parallel的注意事项:
需要确保传递给并行流操作的函数都是线程安全的,
例如,这样做会有问题:
List<String> list = getList();
List<String> list2 = new ArrayList<>();
list.parallelStream().forEach(s -> {
//一定的转换后封装到另一个list
list2.add(s+"ff");
});
System.out.println(list.size());
System.out.println(list2.size());
可以改成这样:
List<String> list = getList();
List<String> list2 = Collections.synchronizedList(new ArrayList<>());
list.parallelStream().forEach(s -> {
//一定的转换后封装到另一个list
list2.add(s+"ff");
});
System.out.println(list.size());
System.out.println(list2.size());