Java8-Stream学习记录

  • Stream是什么?
    Stream(流)是一个来自数据源的元素队列并支持聚合操作(见下面的描述)

  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

在使用Stream的时候有两个需要了解的基础概念

  1. Pipelining(管道): 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  2. 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

代码实践

  • 创建流的方式
    在 Java 8 中, 集合接口有两个方法来生成流:
    stream() 为集合创建串行流。
    parallelStream() 为集合创建并行流(使用多线程的处理方式)。

  • 下面的代码创建了一个流

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

上面代码的含义就是将strings中的空字符串过滤掉,返回一个不包含空字符串的集合。
上面的代码中。stream是创建一个串行流,而filter函数呢照字面意思就是进行过滤,但是出过滤的时候参数需要传递一个函数式接口—Predicate,Predicate接口中在使用的时候其实实现的是它的test方法,该方法的返回值true表示不进行过滤,false表示过滤,上面的代码使用匿名内部类进行改写后成为下面的样子:

        List<String> filtered = strings.stream().filter(new Predicate<String>() {
    
    
            @Override
            public boolean test(String string) {
    
    
                return !string.isEmpty();
            }
        }).collect(Collectors.toList());

使用lambda代码更加简短,但是猛然间可能不直到filter里面是个什么~~,这样看其实就是实现了一个匿名内部类。
collect函数呢是进行聚合操作,将结果输出,需要传递的是一个Collector,Collections.toList()返回的是一个Collector.

创建了流后使用forEach对元素进行迭代

        Random random=new Random();
        random.ints().limit(5).forEach(System.out::println);
        // 也可以写成下面的形式,更清晰,但是上面的形式更简洁
        random.ints().limit(5).forEach(new IntConsumer() {
    
    
            @Override
            public void accept(int value) {
    
    
                System.out.println(value);
            }
        });

上面的代码创建了一个流,使用forEach对流进行遍历,对每一个元素进行打印。forEach中传入的是一个IntConsumer接口,查看该接口的实现之后,该接口的描述如下:

Represents an operation that accepts a single {
    
    @code int}-valued argument and
returns no result

该接口就是接收一个整数,然后对传入的整数执行相应的操作,同时,该操作是没有返回值的。

map() 对每个元素执行相应的操作并返回

下面的代码求每个元素的平方数,并在使用distinct()进行去重,map中我们传入的是一个函数式接口Function

        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        List<Integer> squaresList=numbers.stream().map( x->x*x).distinct().collect(Collectors.toList());
        System.out.println(squaresList);

filter() 对元素进行过滤

下面的代码统计空字符串的个数

        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
        System.out.println(strings.stream().filter(String::isEmpty).count());

将int数组转为集合

		List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());

将int数组转为string

int[] arr = {
    
    1,2,3,4};		
		String str1 = Arrays.stream(arr).boxed().map(i -> i.toString()) //必须将普通数组 boxed才能 在 map 里面 toString
				.collect(Collectors.joining(""));
// 结果为:1234

猜你喜欢

转载自blog.csdn.net/liu_12345_liu/article/details/104034341