栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 8 Stream(流)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 8 Stream(流)

目录

引言

一、Stream背景概述

1、背景

2、概念

3、特性 

4、Stream流的思想

5、 Stream流的好处

 二、生成流

1、Collection体系集合生成

2、Map体系集合生成

3、数组生成

 三、Stream流中间操作方法

1、概念:

2、常见方法:

3、方法展示加拓展

4、常用方法代码展示

filter代码演示

limit&skip代码演示

concat&distinct代码演示

sorted代码演示

map&mapToInt代码演示

四、Stream流终结操作方法

1、概念:

2、常见方法

3、代码演示

 五、Stream流的收集操作

1、概念

2、常用方法

3、工具类Collectors提供了具体的收集方式

4、代码演示

六、ENGING


 

引言


欲练此功,必先自......

 

DUCK不必,咱们就事论事,知识先开^_/^。

一、Stream背景概述

1、背景

java 8 新特性

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+
List transactionsIds = 
widgets.stream()
             .filter(b -> b.getColor() == RED)
             .sorted((x,y) -> x.getWeight() - y.getWeight())
             .mapToInt(Widget::getWeight)
             .sum();

 

2、概念

什么是Stream?

Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。

Stream(流)是一个来自数据源的元素队列并支持聚合操作。

元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。

数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。

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

和以前的Collection操作不同, Stream操作还有两个基础的特征:

Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。

内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

3、特性 

stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。

stream不会改变数据源,通常情况下会产生一个新的集合或一个值。

stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。

 

4、Stream流的思想

 

 

5、 Stream流的好处

  • 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度为3、逐一打印

  • Stream流把真正的函数式编程风格引入到Java中

 

 二、生成流

生成Stream流的方式:

1、Collection体系集合

2、Map体系集合

3、数组

1、Collection体系集合生成

    使用默认方法stream()生成流, default Stream stream()

//Collection体系的集合可以使用默认方法stream()生成流
        List list = new ArrayList();
        Stream listStream = list.stream();

        Set set = new HashSet();
        Stream setStream = set.stream();

2、Map体系集合生成

    把Map转成Set集合,间接的生成流 

//Map体系的集合间接的生成流
        Map map = new HashMap();
        Stream keyStream = map.keySet().stream();
        Stream valueStream = map.values().stream();
        Stream> entryStream = map.entrySet().stream();

3、数组生成

    通过Stream接口的静态方法of(T... values)生成流

 //数组可以通过Stream接口的静态方法of(T... values)生成流
        String[] strArray = {"hello","world","java"};
        Stream strArrayStream = Stream.of(strArray);
        Stream strArrayStream2 = Stream.of("hello", "world", "java");
        Stream intStream = Stream.of(10, 20, 30);

 三、Stream流中间操作方法

1、概念:

中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作。 

 

2、常见方法:

 

3、方法展示加拓展

forEach:

Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。

以下代码片段使用 forEach 输出了10个随机数:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

Collectors:

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。

Collectors 可用于返回列表或字符串:

Liststrings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
 
System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

 

4、常用方法代码展示

filter代码演示

public class StreamDemo01 {
    public static void main(String[] args) {
        //创建一个集合,存储多个字符串元素
        ArrayList list = new ArrayList();

        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");

        //需求1:把list集合中以张开头的元素在控制台输出
        list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
        System.out.println("--------");

        //需求2:把list集合中长度为3的元素在控制台输出
        list.stream().filter(s -> s.length() == 3).forEach(System.out::println);
        System.out.println("--------");

        //需求3:把list集合中以张开头的,长度为3的元素在控制台输出
        list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println);
    }
}

limit&skip代码演示

public class StreamDemo02 {
    public static void main(String[] args) {
        //创建一个集合,存储多个字符串元素
        ArrayList list = new ArrayList();

        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");

        //需求1:取前3个数据在控制台输出
        list.stream().limit(3).forEach(System.out::println);
        System.out.println("--------");

        //需求2:跳过3个元素,把剩下的元素在控制台输出
        list.stream().skip(3).forEach(System.out::println);
        System.out.println("--------");

        //需求3:跳过2个元素,把剩下的元素中前2个在控制台输出
        list.stream().skip(2).limit(2).forEach(System.out::println);
    }
}

concat&distinct代码演示

public class StreamDemo03 {
    public static void main(String[] args) {
        //创建一个集合,存储多个字符串元素
        ArrayList list = new ArrayList();

        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");

        //需求1:取前4个数据组成一个流
        Stream s1 = list.stream().limit(4);

        //需求2:跳过2个数据组成一个流
        Stream s2 = list.stream().skip(2);

        //需求3:合并需求1和需求2得到的流,并把结果在控制台输出
//        Stream.concat(s1,s2).forEach(System.out::println);

        //需求4:合并需求1和需求2得到的流,并把结果在控制台输出,要求字符串元素不能重复
        Stream.concat(s1,s2).distinct().forEach(System.out::println);
    }
}

sorted代码演示

public class StreamDemo04 {
    public static void main(String[] args) {
        //创建一个集合,存储多个字符串元素
        ArrayList list = new ArrayList();

        list.add("linqingxia");
        list.add("zhangmanyu");
        list.add("wangzuxian");
        list.add("liuyan");
        list.add("zhangmin");
        list.add("zhangwuji");

        //需求1:按照字母顺序把数据在控制台输出
//        list.stream().sorted().forEach(System.out::println);

        //需求2:按照字符串长度把数据在控制台输出
        list.stream().sorted((s1,s2) -> {
            int num = s1.length()-s2.length();
            int num2 = num==0?s1.compareTo(s2):num;
            return num2;
        }).forEach(System.out::println);
    }
}

map&mapToInt代码演示

public class StreamDemo05 {
    public static void main(String[] args) {
        //创建一个集合,存储多个字符串元素
        ArrayList list = new ArrayList();

        list.add("10");
        list.add("20");
        list.add("30");
        list.add("40");
        list.add("50");

        //需求:将集合中的字符串数据转换为整数之后在控制台输出
//        list.stream().map(s -> Integer.parseInt(s)).forEach(System.out::println);
//        list.stream().map(Integer::parseInt).forEach(System.out::println);
//        list.stream().mapToInt(Integer::parseInt).forEach(System.out::println);

        //int sum() 返回此流中元素的总和
        int result = list.stream().mapToInt(Integer::parseInt).sum();
        System.out.println(result);
    }
}

 

四、Stream流终结操作方法
1、概念:

终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作。

2、常见方法

3、代码演示
public class StreamDemo {
    public static void main(String[] args) {
        //创建一个集合,存储多个字符串元素
        ArrayList list = new ArrayList();

        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");

        //需求1:把集合中的元素在控制台输出
//        list.stream().forEach(System.out::println);

        //需求2:统计集合中有几个以张开头的元素,并把统计结果在控制台输出
        long count = list.stream().filter(s -> s.startsWith("张")).count();
        System.out.println(count);
    }
}

 五、Stream流的收集操作

1、概念

对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中

 

2、常用方法

 

3、工具类Collectors提供了具体的收集方式

 

4、代码演示
public class CollectDemo {
    public static void main(String[] args) {
        //创建List集合对象
        List list = new ArrayList();
        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");

        

        //创建Set集合对象
        Set set = new HashSet();
        set.add(10);
        set.add(20);
        set.add(30);
        set.add(33);
        set.add(35);

        
        //定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
        String[] strArray = {"林青霞,30", "张曼玉,35", "王祖贤,33", "柳岩,25"};

        //需求5:得到字符串中年龄数据大于28的流
        Stream arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);

        //需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
        Map map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));

        Set keySet = map.keySet();
        for (String key : keySet) {
            Integer value = map.get(key);
            System.out.println(key + "," + value);
        }
    }
}

六、ENGING

多读书吧。 会看书的人,就会看云、看雪、看夜泛星辰......

相信,终是美好会胜过一切,是吗,my princess?是吧......

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/423871.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号