JDK1.8新特性(一):stream
2019-12-02 15:31
阅读目录
二. 举个例子?
现在有一个字符串集合,我们需要过滤掉集合里头长度小于2的字符串:
public static void main( String[] args ) { List<String> strings = Arrays.asList("ab", "", "bc", "cd", "abcd","", "jkl"); List<String> stringList = new ArrayList<>(); for (String str : strings){ //如果长度大于2 if (str.length() >= 2){ //将字符串添加至新集合 stringList.add(str); } } strings = stringList; }
如果使用stream实现一模一样的效果:
public static void main( String[] args ) { List<String> strings = Arrays.asList("ab", "", "bc", "cd", "abcd","", "jkl"); //通过stream操作集合 strings = strings.stream() //去掉长度小于2的字符串 .filter(s -> s.length() >= 2) //转回集合 .collect(Collectors.toList()); }
可见,使用streamAPI可以轻松写出更高效,更简洁,可读性更强的代码
三. 如何使用stream?
简单的说,分两步:生成流,操作流
1. 生成流
Stream 的创建需要指定一个数据源,比如 java.util.Collection的子类,List或者Set, 不支持Map
1.1 Collection接口的stream()或parallelStream()方法
//将Set或List集合直接转换为stream对象 List<Person> personList = new ArrayList<>(); Set<Person> set = new HashSet<>(); Stream<Person> personStream1 = personList.stream();//生成串行流 Stream<Person> personStream2 = set.parallelStream();//生成并行流
1.2 Stream.of(),Arrays.stream,Stream.empty()方法
String[] strArr = {"a","a","a","a","a","a"}; //Stream.empty() Stream<Integer> integerStream = Stream.empty(); //Stream.of() (方法内部调用的还是Arrays.stream) Stream<String> stringStream = Stream.of(strArr); //Arrays.stream Stream<String> stringStream2 = Arrays.stream(strArr);
1.3 Stream.concat()方法
//已有的对象 Stream<Integer> integerStream = Stream.empty(); Stream<String> stringStream = Stream.of(strArr); Stream<String> stringStream2 = Arrays.stream(strArr); //合并两个流 Stream conStream1 = Stream.concat(stringStream,integerStream); Stream conStream2 = Stream.concat(stringStream,stringStream2);