Stream流呢,以前我也有所了解,像一些面试题中也出现过,Java8的新特性,有一块就是这个Stream操作集合,而且在看一些项目中也使用的比较多。但总感觉自己学的一知半解,所以今天打算系统的过一下,再巩固巩固。
Stream是JDK8 API中的新成员,它允许以声明性方式处理集合。
1、把集合转换为流Stream
2、操作Stream流
Stream流在管道中经过 中间操作(intermediate operation)的处理,最后由 最终操作(terminal operation)得到前面处理的结果
方法名 方法作用 返回值类型 方法类型 filter 过滤 Stream 中间操作 map 映射(转换)接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素 Stream 中间操作 peek 窥探 Stream 中间操作 skip 跳过前几个 Stream 中间操作 limit 截取前几个 Stream 中间操作 distinct 去重操作(比较的是地址) Stream 中间操作 sorted 排序操作 Stream 中间操作
方法名 方法作用 返回值类型 方法类型 collect 收集处理结果 泛型 终止操作 count 统计个数 long 终止操作 forEach 逐一处理 void 终止操作 reduce 汇总操作 Optional<> 该对象有get方法可以获取返回值 终止操作
Stream的3个注意事项:
- Stream中间操作方法返回的是新的流
- Stream不调用终结方法,中间的操作不会执行
- Stream只能调用一次终止操作。得到结果后,不能再次使用这个流。
点击查看代码
/**
* 过滤集合中不符合条件的元素
*/
@Test
public void testfilter(){
List<string> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl");
List<string> aList = stringList.stream().filter(str -> str.contains("a")).collect(Collectors.toList());
aList.forEach(System.err::println);
}
/**
*去重
*/
@Test
public void testDistinct(){
List<string> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
List<string> distinctStr = stringList.stream().distinct().collect(Collectors.toList());
distinctStr.forEach(System.out::println);
//--------------------------------
Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");
Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
Product prod3 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
ArrayList<product> proList = Lists.newArrayList(prod1, prod2, prod3);
List<product> distinctProList = proList.stream().distinct().collect(Collectors.toList());
distinctProList.forEach(System.out::println);
}
/**
* limit(n)获取流中的前n个元素
*/
@Test
public void testLimit(){
List<string> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
List<string> limitStr = stringList.stream().limit(3).collect(Collectors.toList());
System.out.println(limitStr);
}
/**
* skip(n)
*/
@Test
public void testSkip(){
List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
List<string> skipStrList = stringList.stream().skip(2).collect(Collectors.toList());
System.out.println(skipStrList);
}
/**
* map() 接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素
*/
@Test
public void testMap(){
List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
List<string> mapStrList = stringList.stream().map(str -> str.concat("_map")).collect(Collectors.toList());
System.out.println(mapStrList);
}
@Test
public void testSorted(){
List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
List<string> sortedStrList = stringList.stream().sorted().collect(Collectors.toList());
System.out.println(sortedStrList);
}
/**
* collect():将流转换为其他形式 list set map
*/
@Test
public void testCollect(){
List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
Set<string> collectSet = stringList.stream().collect(Collectors.toSet());
System.out.println(collectSet);
}
/**
* 将流中元素反复结合起来得到一个结果
*/
@Test
public void testReduce(){
List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
Optional<string> reduce = stringList.stream().reduce((acc, item) -> {return acc + item;});
if (reduce.isPresent()) System.out.println(reduce.get());
}
/**
* 将流中元素反复结合起来得到一个结果
*/
@Test
public void testCount(){
List<string> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
long count = stringList.stream().count();
System.out.println(count);
}
</string></string></string></string></string></string></string></string></string></string></string></string></string></product></product></string></string></string></string>
Original: https://www.cnblogs.com/huoyl/p/Java8_Stream.html
Author: h*z
Title: Java8Stream流
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598586/
转载文章受原作者版权保护。转载请注明原作者出处!