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

无状态中间操作

Java8 新特性 Stream 练习实例

中间无状态操作,可以在单个对单个的数据进行处理。比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)...

过滤 filter
映射 map
扁夹化 flatMap
遍厉 peek

过滤 filter

接收一个谓词断言,boolean Pridicate< T > 根据返回值类型来确定是否过滤这一条属性。

// 过滤 filter
@Test
public void filterTest() {
    list.stream()
            //过滤掉所有小于2000的商品
            .filter(sku -> sku.getSkuPrice() > 2000)
            .forEach(item ->
                    System.out.println(
                            JSON.toJSONString(
                                    item.getSkuName()+item.getSkuPrice(),
                                    true)));
    /**
     * 输出的结果
     * "无人机4999.0"
     * "VR一体机2299.0"
     * "跑步机2699.0"
     */

映射 map

流支持map方法,接收一个Function< T,R > 函数型接口,这个方法会应用每个元素都,并且把他们映射成一个新的流。其实在上面的例子中已经用的非常的多了,比如说,接收一个SKu类型的流,但是经过map以后,返回的是String的流。

//映射 map
@Test
public void mapTest() {
    list.stream()
            //用方法引用取出来sku中的所有的商品名称
            .map(Sku::getSkuName)
            .forEach(item -> System.out.println(item));
    /**
     * 无人机
     * VR一体机
     * 纯色衬衫
     * 牛仔裤
     * 跑步机
     * Java编程思想
     * Java核心技术
     * 算法
     * TensorFlow进阶指南
     */
}

扁平化 flatMap

flatMap方法就是让你一个流中的每个值都换成另一个流,把所有的流都边接成为一个流:例

//扁夹化 flatMap
@Test
public void flatMap() {
    List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action");
    List<String[]> listStringArrays = words.stream()
            //分割每一个单词
            .map(word -> word.split(""))
            //对所有的元素去重
            .distinct()
            //收集成list集合
            .collect(Collectors.toList());

    listStringArrays.forEach(arr ->
            System.out.println(Arrays.toString(arr)));
    /**
     * 非扁平化
     * 这是把每一个数组当成了一整个元素,
     * 然后对一整个数组进行去重,
     * 如果数组没有重复的就不会去重
     * [J, a, v, a,  , 8]
     * [L, a, m, b, d, a, s]
     * [I, n]
     * [A, c, t, i, o, n]
     */
    List<String> listString = words.stream()
            //映射成String[]数组流
            .map(word -> word.split(""))
            //扁平化
            .flatMap(Arrays::stream)
            //去重
            .distinct()
            //排序
            .sorted()
            //收集
            .collect(Collectors.toList());
    listString.forEach(System.out::println);
    /**
     * 扁平化是把所有的数组map映射出来的数组流
     * 转换成一个流,而不是一个数组流,这样就可以去重了
     *  8 A I J L a b c d i m n o s t v
     */
}

遍厉 peek

和终端操作一样,都是进行循环的。用的是peek方法,里面接收一个comsumer方法。这个方法最能体现无状态中间操作的:

//遍厉 peek
@Test
public void peekTest() {
    list.stream()
            //获取商品名称
            .map(Sku::getSkuName)
            //遍厉
            .peek(skuName -> System.out.println(skuName + " peek"))
            .forEach(System.out::println);
    /**
     * 看结果是和forEach效替进行输出,而不是peek输出之后再进行forEach
     * 说明,peek不用在所有的元素的基础上进行操作,只用消费就行了
     *
     * 无人机 peek
     * 无人机
     * VR一体机 peek
     * VR一体机
     * 纯色衬衫 peek
     * 纯色衬衫
     * 牛仔裤 peek
     * 牛仔裤
     * 跑步机 peek
     * 跑步机
     * Java编程思想 peek
     * Java编程思想
     * Java核心技术 peek
     * Java核心技术
     * 算法 peek
     * 算法
     * TensorFlow进阶指南 peek
     * TensorFlow进阶指南
     */
    list.stream()
            //获取商品名称
            .map(Sku::getSkuName)
            //遍厉
            .peek(skuName -> System.out.println(skuName + " peek"))
            //排序
            .sorted()
            .forEach(System.out::println);
    /**
     * 这个地方就是加了一个有状态中间操作
     * 因为排序必须在所有的数据基础上进行操作的
     *
     * 无人机 peek
     * VR一体机 peek
     * 纯色衬衫 peek
     * 牛仔裤 peek
     * 跑步机 peek
     * Java编程思想 peek
     * Java核心技术 peek
     * 算法 peek
     * TensorFlow进阶指南 peek
     * Java核心技术
     * Java编程思想
     * TensorFlow进阶指南
     * VR一体机
     * 无人机
     * 牛仔裤
     * 算法
     * 纯色衬衫
     * 跑步机
     */
}

细节决定成败!

个人愚见,如有不对,恳请扶正!

原文地址:https://www.cnblogs.com/xdtg/p/12000647.html

时间: 2024-07-30 19:28:46

Java8 新特性 Stream 无状态中间操作的相关文章

Java8 新特性 Stream 短路终端操作

短路终端操作 Java8 新特性 Stream 练习实例 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 noneMatch 查找首个 findFirst 查找任意 findAny 匹配所有 allMatch //匹配所有 allMatch @Test public void allMatchTest() { boolean b = list.stream() //所有的商品价格都大于40 .allMatch(

Java8 新特性 Stream 非短路终端操作

非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大值 max 最小值 min 聚合 collect 计数 count 遍厉 forEach //遍厉 forEach @Test public void forEachTest() { list.stream() .forEach(iter -> //以json格式输出 System.out.prin

Java8新特性Stream API与Lambda表达式详解(1)

1 为什么需要Stream与Lambda表达式? 1.1  为什么需要Stream Stream作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggr

java8 新特性 Stream

1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的Iterator.原始版本的Iterator,用户只能一个一

Java8新特性 --Stream

一. 创建Stream 创建Stream方式一: 集合类的stream()或 parallelStream() java List<String> list = new ArrayList<>(); Stream<String> stream = list.stream(); 创建Stream方式二: 通过Arrays中的静态方法stream()获取 String[] strings = new String[10]; Stream<String> stre

java8新特性——Stream

一.stream介绍 stream(流)是一个来自数据源的元素队列 集合讲的是数据,而流讲的是计算 注意: ①stream自己不会存储元素 ②stream不会改变源对象,相反他会返回一个持有结果的新stream ③stream操作是延时执行的,这意味着他们会等到需要结果的时候才执行 stream操作的三个步骤 ①创建stream //1.通过Collection 系列集合提供的stream()[串行流]或 [并行流]来生成流 List list = new ArrayList(); Stream

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

Java8 新特性 Stream() 创建流

通过Controllere类的Stream()和parallelStream()创建流 //通过集合创建流 @Test public void test1() { String arr[] = new String[]{"a", "b", "c"}; //把数组转换成集合 List<String> list = Arrays.asList(arr); //生成stream流(串行流) Stream<String> stre