美文网首页
11-Stream流[1]

11-Stream流[1]

作者: XAbo | 来源:发表于2021-01-24 19:49 被阅读0次

一、Stream介绍

Stream是用于集合迭代器的增强,使之能够完成更高效的聚合操作,或者大批量数据操作。

二、Stream的API

2.1 获取Stream流

public class Demo01GetStream {
    public static void main(String[] args) {
   // 1.Collection和Array通过stream()【串行】或者parallelStream()【并行】。 
        //把集合转换为Stream流
        List<String> list = new ArrayList<>();
        Stream<String> stream1 = list.stream();
        Set<String> set = new HashSet<>();
        Stream<String> stream2 = set.stream();
        Map<String,String> map = new HashMap<>();
        //获取键,存储到一个Set集合中
        Set<String> keySet = map.keySet();
        Stream<String> stream3 = keySet.stream();
        //获取值,存储到一个Collection集合中
        Collection<String> values = map.values();
        Stream<String> stream4 = values.stream();
        //获取键值对(键与值的映射关系 entrySet)
        Set<Map.Entry<String, String>> entries = map.entrySet();
        Stream<Map.Entry<String, String>> stream5 = entries.stream();
    //2.Stream接口的静态方法of可以获取数组对应的流。
        //把数组转换为Stream流
        Stream<Integer> stream6 = Stream.of(1, 2, 3, 4, 5);
        //可变参数可以传递数组
        Integer[] arr = {1,2,3,4,5};
        Stream<Integer> stream7 = Stream.of(arr);
        String[] arr2 = {"a","bb","ccc"};
        Stream<String> stream8 = Stream.of(arr2);
   
    //3.Stream.iterate() 、Stream.generate()创建无限流。
        //迭代
        Stream<Integer> stream9 = Stream.iterate(0,(x) -> x+2);
        stream9.limit(10).forEach(System.out::println);
         //生成
       Stream<Integer> stream10 = Stream.generate(() -> Math.random());
       stream10.limit(10).forEach(System.out::println);

    }
}

2.2 流的转换

filter方法:过滤流中数据

//需求:过滤integerList中小于50的,并生成新的List<Integer>
List<Integer> integerList =  new ArrayList();
 integerList.add(15);
 integerList.add(32);
 integerList.add(5);
 integerList.add(232);
 integerList.add(56);
//Lamdba写法
List<Integer> after2 = integerList.stream().filter(i->i>50)
                .collect(Collectors.toList());
System.out.println(after2);

map方法:类型转换

// 需求:将List<Integer>类型转换成List<String>类型
List<Integer> integerList =  new ArrayList();
integerList.add(15);
integerList.add(32);
integerList.add(5);
integerList.add(232);
integerList.add(56);
//lamdba表达式写法
List<String> afterString2 = integerList.stream().map(i->String.valueOf(i))
.collect(Collectors.toList());
System.out.println(afterString2.toString());

flatMap方法:类型转换

//需求:从testMap中取出oneList+twoList的List<Integer>
List<Integer>  oneList =  new ArrayList();
List<Integer>  twoList =  new ArrayList();
oneList.add(34);
oneList.add(23);
twoList.add(29);
twoList.add(48);
Map<String,List<Integer>> testMap = new HashMap();
testMap.put("1",oneList);
testMap.put("2",twoList);
//Lamdba写法
List<Integer> testList1 =  testMap.values().stream().flatMap(number->number.stream()).collect(Collectors.toList());
System.out.println(testList1.toString());

2.3 聚合操作(终止)

max方法和min方法

List<Integer> hearList = Lists.newArrayList();
hearList.add(15);
hearList.add(32);
hearList.add(94);
Integer maxItem = hearList.stream().max(Integer::compareTo).get();
Integer minItem = hearList.stream().min(Integer::compareTo).get();
System.out.println("max:"+maxItem+",min:"+minItem);

reduce方法

List<Integer> hearList = Lists.newArrayList();
hearList.add(15);
hearList.add(56);
hearList.add(29);
hearList.add(104);
//求和
Integer sum = hearList.stream().reduce((x,y)->x+y).get();
System.out.println("sum:"+sum);
//简化一下,求和
sum = hearList.stream().reduce(Integer::sum).get();
System.out.println("sum:"+sum);
//含有初始标识的,求和
sum = hearList.stream().reduce(0,(x,y)->x+y);
System.out.println("sum:"+sum);
//对元素的长度进行求和( (total,y)->total+y.toString().length(),类似于一个累加器,会被重复调用)
sum = hearList.stream().reduce(0,(total,y)->total+y.toString().length(),(total1,total2)->total1+total2);
System.out.println("sum:"+sum);
//简化一下,对元素长度进行求和。
sum = hearList.stream().map(Objects::toString).mapToInt(String::length).sum();
System.out.println("sum:"+sum);

其他常见聚合API:findFirstfindAnyanyMatchallMatchnoneMatch

2.4 收集结果(终止)

当处理完流之后,通常是想查看一下结果,而不是将他们聚合为一个值。Collectorts类为我们提供了常用的收集类的各个工厂方法。
收集到集合

//收集到一个List
List<Integer> thereList = hereList.stream().collect(Collectors.toList());
//收集到Set中
Set<Integer> thereSet = hereList.stream().collect(Collectors.toSet());
//收集到Set时,控制Set的类型
TreeSet<Integer> treeSet = hereList.stream().collect(Collectors.toCollection(TreeSet::new));
//收集到map
Map<Integer,Integer> hwMap = roomList.stream().collect(Collectors.toMap(Room::getHigh, Room::getWidth));

拼接

//将字流中的字符串连接并收集起来
String resultString = stringList.stream().collect(Collectors.joining());
//在将流中的字符串连接并收集起来时,想在元素中介添加分隔符,传递个joining方法即可
String resultString = stringList.stream().collect(Collectors.joining(","));
//当流中的元素不是字符串时,需要先将流转成字符串流再进行拼接。
String hereResultString = hereList.stream().map(String::valueOf).collect(Collectors.joining(","));

2.5 并行流

我们使在处理集合数据量较大的时候才能体现出并行流的优势,并且目的是为了在保证线程安全的情况下,提升效率,利用多核CPU的资源。并行流就是把一个内容分成多个数据块,并用不同的线程分成多个数据块,并用不同的线程分别处理每个数据块的流,串行流则相反。

public static void main(String[] args) {
    Random random = new Random();

    //非并行流
    Stream.generate(() -> random.nextInt(1000))
            .limit(10)
            .forEach(x -> System.out.println(x + ": " + Thread.currentThread().getName()));

    //并行流
    Stream.generate(() -> random.nextInt(1000))
            .limit(1000)
            //转换成并行流
            .parallel()
            .forEach(x -> System.out.println(x + ": " + Thread.currentThread().getName()));
}
ForkJoinPool

相关文章

  • 11-Stream流[1]

    一、Stream介绍 二、Stream的API https://www.cnblogs.com/jimoer/p/...

  • 流(1)

    “不好意思,你的鞋子好漂亮,请问从哪里买的?” 米粒和安吉最初的搭讪从这里开始。拥挤地潮水般的地铁人群中,她俩总是...

  • 流(IO)1

    流(IO):(input/output):实现的是两个设备之间的数据传输设备:网络、磁盘(硬盘)、内存、控制台、键...

  • IO流1

    IO流一 字节流 FileInputStream FileOutputStream 当指向的文件不逊在世,会自动创...

  • 心流1

    蓬头稚子学垂纶,侧坐莓苔草映身。 路人借问遥招手,怕得鱼惊不应人。 同事H跟我说,512地震时,西安有较强的震感,...

  • 控件流 1

    var optionalString: String? = "Hello" print(optionalStrin...

  • 流月1

    终于进入新一轮的流月了,流月9,过的迷迷糊糊的。有些事情一在纠结,是否要舍弃,最终在流月1来临前,决定了。决绝要留...

  • 心流1

    心流的成因和特征。第一,注意力。他说:体验过心流的人都知道,那份深沉的快乐是严格的自律、集中注意力换来的。第二,有...

  • 《心流》1

    拒绝外部奖励的最有效的方法是建立“内奖”,即选定你的目标,在追随目标的努力中,获得内心的秩序和成长的乐趣,这就是内...

  • 《心流》1

    【字数】551 【内容】 “心流”一次第一次听到也是在2019年。 在猫叔的[践行者大会]上的一个嘉宾的分享,具体...

网友评论

      本文标题:11-Stream流[1]

      本文链接:https://www.haomeiwen.com/subject/akwmzktx.html