Java:JDK8中Stream的用法

简介: Java:JDK8中Stream的用法

目录

筛选

需求:

  • 筛选出年龄大于20的人

实体类 User.java

package com.example.demo;
public class User {
    private String name;
    private Integer age;
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

使用for循环

package com.example.demo;
import java.util.ArrayList;
import java.util.List;
public class Demo {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User("刘备", 40));
        userList.add(new User("关羽", 30));
        userList.add(new User("张飞", 20));
        // 筛选出年龄大于20的人
        List<User> newUserList = new ArrayList<>();
        for (User user : userList) {
            if (user.getAge() > 20) {
                newUserList.add(user);
            }
        }
        System.out.println(newUserList);
        // [User{name='刘备', age=40}, User{name='关羽', age=30}]
    }
}

使用Stream

package com.example.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Demo {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User("刘备", 40));
        userList.add(new User("关羽", 30));
        userList.add(new User("张飞", 20));
        // 筛选出年龄大于20的人
        List<User> newUserList = userList
                .stream()
                .filter(u -> u.getAge() > 20)
                .collect(Collectors.toList());
        System.out.println(newUserList);
        // [User{name='刘备', age=40}, User{name='关羽', age=30}]
    }
}

循环

JDK7

package com.example.demo;
import java.util.ArrayList;
import java.util.List;
public class Demo {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User("刘备", 40));
        userList.add(new User("关羽", 30));
        userList.add(new User("张飞", 20));
        for (User user : userList) {
            System.out.println(user);
        }
        // User{name='刘备', age=40}
        // User{name='关羽', age=30}
        // User{name='张飞', age=20}
    }
}

JDK8

package com.example.demo;
import java.util.ArrayList;
import java.util.List;
public class Demo {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User("刘备", 40));
        userList.add(new User("关羽", 30));
        userList.add(new User("张飞", 20));
        userList.stream().forEach(u -> {
            System.out.println(u);
        });
        // 或者
        // userList.forEach(u -> {
        //     System.out.println(u);
        // });
        // User{name='刘备', age=40}
        // User{name='关羽', age=30}
        // User{name='张飞', age=20}
    }
}

聚合函数

需求:

  • 获取List 中字符串最长的那个

JDK7

package com.example.demo;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Demo {
    public static void main(String[] args) {
        String[] strArr = new String[]{"a", "bb", "ccc"};
        List<String> list = Arrays.asList(strArr);
        String max = Collections.max(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1.length() < o2.length()) {
                    return -1;
                } else if (o1.length() > o2.length()) {
                    return 1;
                } else {
                    return o1.compareTo(o2);
                }
            }
        });
        System.out.println(max);
        // ccc
    }
}

JDK8

package com.example.demo;
import java.util.*;
public class Demo {
    public static void main(String[] args) {
        String[] strArr = new String[]{"a", "bb", "ccc"};
        List<String> list = Arrays.asList(strArr);
        Optional<String> max = list.stream()
                .max(Comparator.comparing(String::length));
        System.out.println(max.get());
        // ccc
    }
}

count

package com.example.demo;
import java.util.*;
public class Demo {
    public static void main(String[] args) {
        // 获取List中大于2的元素的个数
        List<Integer> list = Arrays.asList(1, 2, 3);
        long count = list.stream()
                .filter(x -> x > 2)
                .count();
        System.out.println(count);
        // 1
    }
}

Map

需求:

  • 获取List中的name 数据

JDK7

package com.example.demo;
import java.util.*;
public class Demo {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User("刘备", 40));
        userList.add(new User("关羽", 30));
        userList.add(new User("张飞", 20));
        List<String> names = new ArrayList<>();
        for (User user : userList) {
            names.add(user.getName());
        }
        System.out.println(names);
        //    [刘备, 关羽, 张飞]
    }
}

JDK8

package com.example.demo;
import java.util.*;
import java.util.stream.Collectors;
public class Demo {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User("刘备", 40));
        userList.add(new User("关羽", 30));
        userList.add(new User("张飞", 20));
        List<String> names = userList.stream()
                .map(User::getName)
                .collect(Collectors.toList());
        System.out.println(names);
        //    [刘备, 关羽, 张飞]
    }
}

参考

别再问问JDK的Stream怎么用了好么?面试官


相关文章
|
6天前
|
Java API C++
Java 8 Stream Api 中的 peek 操作
本文介绍了Java中`Stream`的`peek`操作,该操作通过`Consumer&lt;T&gt;`函数消费流中的每个元素,但不改变元素类型。文章详细解释了`Consumer&lt;T&gt;`接口及其使用场景,并通过示例代码展示了`peek`操作的应用。此外,还对比了`peek`与`map`的区别,帮助读者更好地理解这两种操作的不同用途。作者为码农小胖哥,原文发布于稀土掘金。
Java 8 Stream Api 中的 peek 操作
|
6天前
|
Java C# Swift
Java Stream中peek和map不为人知的秘密
本文通过一个Java Stream中的示例,探讨了`peek`方法在流式处理中的应用及其潜在问题。首先介绍了`peek`的基本定义与使用,并通过代码展示了其如何在流中对每个元素进行操作而不返回结果。接着讨论了`peek`作为中间操作的懒执行特性,强调了如果没有终端操作则不会执行的问题。文章指出,在某些情况下使用`peek`可能比`map`更简洁,但也需注意其懒执行带来的影响。
Java Stream中peek和map不为人知的秘密
|
8天前
|
Java API 开发者
【Java模块化新飞跃】JDK 22模块化增强:构建更灵活、更可维护的应用架构!
【9月更文挑战第9天】JDK 22的模块化增强为开发者构建更灵活、更可维护的应用架构提供了强有力的支持。通过模块化设计、精细的依赖管理和丰富的工具支持,开发者可以更加高效地开发和管理应用,提高应用的性能和可维护性。
41 10
|
10天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
35 11
|
8天前
|
监控 IDE Java
【Java性能调优新工具】JDK 22性能分析器:深度剖析,优化无死角!
【9月更文挑战第9天】JDK 22中的性能分析器为Java应用的性能调优提供了强大的支持。通过深度集成、全面监控、精细化分析和灵活报告生成等核心优势,性能分析器帮助开发者实现了对应用性能的全面掌控和深度优化。在未来的Java开发过程中,我们期待性能分析器能够继续发挥重要作用,为Java应用的性能提升贡献更多力量。
|
8天前
|
监控 Java 大数据
【Java内存管理新突破】JDK 22:细粒度内存管理API,精准控制每一块内存!
【9月更文挑战第9天】虽然目前JDK 22的确切内容尚未公布,但我们可以根据Java语言的发展趋势和社区的需求,预测细粒度内存管理API可能成为未来Java内存管理领域的新突破。这套API将为开发者提供前所未有的内存控制能力,助力Java应用在更多领域发挥更大作用。我们期待JDK 22的发布,期待Java语言在内存管理领域的持续创新和发展。
|
10天前
|
Java API 数据处理
【Java的SIMD革命】JDK 22向量API:释放硬件潜能,让Java应用性能飙升!
【9月更文挑战第7天】 JDK 22向量API的发布标志着Java编程语言在SIMD技术领域的重大突破。这一新特性不仅释放了现代硬件的潜能,更让Java应用性能实现了飙升。我们有理由相信,在未来的发展中,Java将继续引领编程语言的潮流,为开发者们带来更加高效、更加强大的编程体验。让我们共同期待Java在SIMD技术的推动下开启一个全新的性能提升时代!
|
11天前
|
Oracle Java 关系型数据库
【颠覆性升级】JDK 22:超级构造器与区域锁,重塑Java编程的两大基石!
【9月更文挑战第6天】JDK 22的发布标志着Java编程语言在性能和灵活性方面迈出了重要的一步。超级构造器和区域锁这两大基石的引入,不仅简化了代码设计,提高了开发效率,还优化了垃圾收集器的性能,降低了应用延迟。这些改进不仅展示了Oracle在Java生态系统中的持续改进和创新精神,也为广大Java开发者提供了更多的可能性和便利。我们有理由相信,在未来的Java编程中,这些新特性将发挥越来越重要的作用,推动Java技术不断向前发展。
|
9天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
3天前
|
安全 Java
Java switch case隐藏用法
在 Java 中,`switch` 语句是一种多分支选择结构,常用于根据变量值执行不同代码块。除基本用法外,它还有多种进阶技巧,如使用字符串(Java 7 开始支持)、多个 `case` 共享代码块、不使用 `break` 实现 “fall-through”、使用枚举类型、使用表达式(Java 12 及以上)、组合条件以及使用标签等。这些技巧使代码更加简洁、清晰且高效。