jdk1.8新特性Stream流式处理

前言:

  之前在学习JDK1.8的时候接触到了1.8的两个重要的新特新,一个是lambda函数式编程、另一个则是接口的变化,在这里还有一个非常重要的内容就是strema流式处理方式,在传统的java代码中,如果我们要对一个集合做一些操作,就必须遍历这个集合那个集合中的元素逐个操作,而在JDK1.8引入stream流式处理方式后,我们可以不用对集合进行遍历可以直接操作集合得到我们想要的结果,在这里看一个小例子:

  例如在这里有一个存放字符串的list集合,我需要获取list集合字符长度是三且不为空的字符串并且打印,我们来看一下传统方式和stream方式的两种写法

public class Dermo01Strema {

    public static void main(String[] args) {

        List<String> list = new ArrayList<String>();
        list.add("逝清雪");
        list.add("莫问");

        /**
         * 传统方式
         */
        for(String s: list){
            if(null != s && s.length() == 3){
                System.out.println(s);
            }
        }

        /**
         * strema方式
         */
        list.stream().filter(s -> null != s).filter(s -> s.length() == 3).forEach(System.out::println);

    }
}

  运行上面的代码,我们都可以筛选出符合条件的字符串是“逝清雪”,但可以明显看出用strema比我们用传统的方式简便很多,尤其是在我们判断条件继续增加是,会越来越明显,而且stream和lambda一样都是延迟执行,性能上要高效一些。

一、获取stream的方式

  通过上面的代码可以看到我们我们在用strema流时,首先是通过:集合.stream()方法获取到了集合流,从而调用java为我们提供Strema接口中的方法,那么我们要想使用stream流,就必须先获取,关于获取stream流的方式则有以下两种。

  1、集合Collection:直接.stream():

  2、集合Map:使用间接方法entrySet、keySet、values,在.stream()方法,注:Map并不是Collection字接口,所以不能像Collection集合那样直接.stream()方式获取

  3、数组:Arrays.stream方法、或者是Stream.of方法

public class Dermo01Strema {

    public static void main(String[] args) {

        List<String> list1 = new ArrayList<String>();
        Stream<String> stremaList = list1.stream();

        Map<String, Integer> map = new HashMap<String, Integer>();
        Stream<String> mapStream2 = map.keySet().stream();
        Stream<Integer> mapStream3 = map.values().stream();
        Stream<Map.Entry<String, Integer>> mapStream1 = map.entrySet().stream();

        String[] array = {"苍井空", "吉泽明步"};

        Stream<String> arrayStream1 = Arrays.stream(array);
        Stream<String> arrayStream2 = Stream.of(array);
   

二、stream中常用的方法

  1、条件过滤:filter

  2、统计个数:counrt

  3、截取集合中的前几个元素:limit

  4、抛弃集合中的前几个元素:skip

  5、合并集合:concat

  6、消费集合中的元素:forEach,注:forEach并不是for循环

public class Dermo01Strema {

    public static void main(String[] args) {

        List<String> list1 = new ArrayList<String>();
        list1.add("莫问");
        list1.add("逝清雪");
        list1.add("王母娘娘");
        list1.add("玉皇大帝");
        list1.add("吉泽明步");

        //filter方法
        list1.stream().filter(s -> null != s).filter(s -> s.length() == 3).forEach(System.out::println);

        //count方法
        System.out.println("count方法执行-------------");
        System.out.println(list1.stream().count());

        //limit方法
        System.out.println("limit方法执行-------------");
        list1.stream().limit(2).forEach(System.out::println);

        //skip方法
        System.out.println("skip方法执行-------------");
        list1.stream().skip(2).forEach(System.out::println);

        //concat方法
        System.out.println("concat方法执行-------------");
        List<String> list2 = new ArrayList<String>();
        list2.add("苍井空");
        list2.add("宫崎骏");
        Stream.concat(list1.stream(),list2.stream()).forEach(System.out::println);
    }
}

三、将stream流转换成集合的方式

  1、转List集合:stream.collect(Collectors.toList()):

  2、转Set集合:stream.collect(Collectors.toSet()):

  3、转数组:stream.toArray()、或者stream.toArray(泛型),注:推荐第二种,因为可以直接指定转换后数组的泛型

public class Dermo01Strema {

    public static void main(String[] args) {

        List<String> list1 = new ArrayList<String>();
        Stream<String> stremaList = list1.stream();

        List<String> list12 = stremaList.collect(Collectors.toList());
        Set<String> set = stremaList.collect(Collectors.toSet());

        String[] array = {"苍井空", "吉泽明步"};
        Stream<String> arrayStream1 = Arrays.stream(array);

        String[] arry = arrayStream1.toArray(String[]::new);
    }
}

四、stream获取并发流

  1、直接获取:.parallelStream()

  2、间接获取:stream.parallel()

public class Dermo01Strema {

    public static void main(String[] args) {

        List<String> list1 = new ArrayList<String>();

        Stream<String> strema1 = list1.stream().parallel();
        Stream<String> strema2 = list1.parallelStream();
    }
}

原文地址:https://www.cnblogs.com/zouxiangzhongyan/p/11442837.html

时间: 2024-11-13 05:25:18

jdk1.8新特性Stream流式处理的相关文章

Java8 新特性之流式数据处理

一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现. 比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需要通过如下代码实现: List<Integer> evens = new ArrayList<>(); for (final Integer num : nums) { if (num % 2 =

Java8新特性——stream流

一.基本API初探 package java8.stream; import java.util.Arrays; import java.util.IntSummaryStatistics; import java.util.List; import java.util.Random; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * @author [email protected] * @

java8 新特性 Stream流 分组 排序 过滤 多条件去重

private static List<User> list = new ArrayList<User>(); public static void main(String[] args) { list = Arrays.asList( new User(1, "a", 10), new User(4, "d", 19), new User(5, "e", 13), new User(2, "b", 1

JDK1.8新特性——Collector接口和Collectors工具类

JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进和优化. 部分内容来自以下博客: https://www.jianshu.com/p/7eaa0969b424 流式处理 JDK1.8中新增的流式处理提供了一种高效且易于使用的处理数据的方式,它可以对集合执行非常复杂的查找.过滤和映射数据等操作,极大的简化了对于集合的使用.借助流式处理,可以像使用S

jdk1.8新特性应用之Iterable

我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback done) { if (Util.isEmpty(request)) { return; } Descriptor descriptor = request.getDescriptorForType(); if (Util.isEmpty(descriptor)) { return; } Field

Java8 新特性 Stream 无状态中间操作

无状态中间操作 Java8 新特性 Stream 练习实例 中间无状态操作,可以在单个对单个的数据进行处理.比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)... 过滤 filter 映射 map 扁夹化 flatMap 遍厉 peek 过滤 filter 接收一个谓词断言,boolean Pridicate< T > 根据返回值类型来确定是否过滤这一条属性. // 过滤 filter @Test public void filterTest() { list.stre

jdk1.5新特性和jdk1.7新特性

jdk1.5新特性 1.自动装箱和自动拆箱 自动装箱,把基本类型的值变成对象类型 Integer a = 2; 自动拆箱,把对象类型变成基本类型 int b = new Integer(2); 而不需要调用intValue int b = new Integer(2).intValue(); 包装类有 Integer Boolean Float Double Short Byte 2.枚举 java枚举具有简单和安全性. 3.泛型 泛型在编译的时候可以控制类型,比如说List<String>

黑马程序员——java高新---JDK1.5新特性和反射

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.JDK1.5新特性 ——>静态导入 import和import static之间的区别: 1.import是导入一个类或某个包中所有的类. 2.import static是导入一个类中的某个静态成员或所有的静态成员. 注意: 1.当导入的两个类中有同名成员时,需要在成员前加上相应的类名. 2.当类名重名时,需要指定具体的包名. 3.方法重名时,需要指定具体所属的对象或者类. 代码示例: 1

Java 8 新特性1-函数式接口

Java 8 新特性1-函数式接口 (原) Lambda表达式基本结构: (param1,param2,param3) -> {代码块} 例1: package com.demo.jdk8; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; public class Test2 { public static void main(String[] args) { for_test