Java Stream 最全操作用法合集

转载:https://zhuanlan.zhihu.com/p/601692168

Java 8 引入了Stream流的操作。

在这里插入图片描述
在这里插入图片描述

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
System.out.println(squaresList);
//输出结果:[9, 4, 49, 25]  其中distinct()是去掉重复的值。

在这里插入图片描述

@Data
public class StaffPublic {

    private String name;//名称

    private Integer age;//年龄

    private String extra;//额外信息

    public Staff(String name, Integer age, String extra) {
        this.name = name;
        this.age = age;
        this.extra= extra;
    }
}
@Data
public class Staff {

    private String name;//名称

    private Integer age;//年龄

    private String sex;//性别

    public Staff(String name, Integer age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}
List<Staff> staff = new ArrayList<>();
staff.add(new Staff("ricky",30,"man"));
staff.add(new Staff("jack",27,"man"));
staff.add(new Staff("lawrence",33,"woman"));
List<String> collect = staff.stream().map(x -> x.getName()).collect(Collectors.toList());
System.out.println(collect); 
//输出 [ricky, jack, lawrence]

在这里插入图片描述

List<StaffPublic> result = staff.stream().map(temp -> {
            StaffPublic obj = new StaffPublic();
            obj.setName(temp.getName());
            obj.setAge(temp.getAge());
            if ("ricky".equals(temp.getName())) {
                obj.setExtra("this field is for ricky only!");
            }
            return obj;
        }).collect(Collectors.toList());
System.out.println(result);
//输出
[
    StaffPublic{name='ricky', age=30, extra='this field is for ricky only!'},
    StaffPublic{name='jack', age=27, extra='null'},
    StaffPublic{name='lawrence', age=33, extra='null'}
]

在这里插入图片描述

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.stream().filter(string -> string.isEmpty()).count();
// 输出结果:2

在这里插入图片描述

List<StudentInfo> studentList = new ArrayList<>();
studentList.add(new StudentInfo("李小明",true,18,1.76,LocalDate.of(2001,3,23)));
studentList.add(new StudentInfo("张小丽",false,18,1.61,LocalDate.of(2001,6,3)));
studentList.add(new StudentInfo("王大朋",true,19,1.82,LocalDate.of(2000,3,11)));
studentList.add(new StudentInfo("陈小跑",false,17,1.67,LocalDate.of(2002,10,18)));

List<StudentInfo> boys = studentList.stream().filter(s->s.getGender() && s.getHeight() >= 1.8)
                                    .collect(Collectors.toList());
StudentInfo.printStudents(boys);
// 输出 "王大朋",true,19,1.82,2002-10-18   gender解释 false代表女生 true代表男生

在这里插入图片描述

Random random = new Random();
random.ints().limit(3).forEach(System.out::println);
// 输出结果
93148391
-108910530
-654413184

在这里插入图片描述

List<String> strings = Arrays.asList("abc", "dd", "bc", "efg", "abcd","cc", "jkl");
strings.stream().limit(2).forEach(System.out::println);
//输出 abc dd

在这里插入图片描述

List<String>strings = Arrays.asList("abc", "dd", "bc", "efg", "abcd","cc", "jkl");
strings.stream().skip(3).forEach(System.out::println);
// 输出结果
efg
abcd
cc
jkl

在这里插入图片描述

List<String>strings = Arrays.asList("abc", "dd", "bc", "abc", "bc","cc", "dd");
strings.stream().distinct().forEach(System.out::println);
// 输出结果
abc
dd
bc
cc

在这里插入图片描述

Stream.of("one", "two", "three","four").filter(e -> e.length() > 3)
                .peek(e -> System.out.println("Filtered value: " + e))
                .map(String::toUpperCase)
                .peek(e -> System.out.println("Mapped value: " + e))
                .collect(Collectors.toList());
//输出
Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR

在这里插入图片描述

List<String> list = Arrays.asList("cc","aa","dd","bb");
        list.stream().sorted().forEach(System.out::println);
//输出
aa
bb
cc
dd

在这里插入图片描述

List<String> list = Arrays.asList("cc","aa","dd","bb");
        list.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);
//输出
dd
cc
bb
aa

在这里插入图片描述

@Data
@AllArgsConstructor
public class Employee {
    private String name;
    private Integer age;
}
// 初始化参数
List<Employee> list = new ArrayList<>();
        list.add(new Employee("张三",33));
        list.add(new Employee("李四",28));
        list.add(new Employee("王五",25));
        list.add(new Employee("赵六",40));
        list.add(new Employee("孙七",18));
list.stream().sorted(Comparator.comparingInt(Employee::getAge)).forEach(System.out::println);
// 输出
Employee(name=孙七, age=18)
Employee(name=王五, age=25)
Employee(name=李四, age=28)
Employee(name=张三, age=33)
Employee(name=赵六, age=40)

在这里插入图片描述

list.stream().sorted(Comparator.comparingInt(Employee::getAge).reversed()).forEach(System.out::println);
//输出
Employee(name=赵六, age=40)
Employee(name=张三, age=33)
Employee(name=李四, age=28)
Employee(name=王五, age=25)
Employee(name=孙七, age=18)

在这里插入图片描述

List list= Arrays.asList("a", "b", "c", "d");

List collect =list.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(collect); 
//输出
[A, B, C, D]

数组所有元素,按某种规律计算:
List num = Arrays.asList(1,2,3,4,5);
List collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());
System.out.println(collect1); 
//输出
[2, 4, 6, 8, 10]

在这里插入图片描述

Stream<String> stream = Stream.of("hello", "world", "helloworld");
//转成ArrayList
ArrayList<String> list = stream.collect(Collectors.toCollection(ArrayList::new));
//转成TreeSet
TreeSet<String> treeSet = stream.collect(Collectors.toCollection(TreeSet::new));

在这里插入图片描述

Stream<String> stream = Stream.of("hello", "world", "helloworld");
        String s = stream.collect(Collectors.joining(","));
        System.out.println(s);
//输出
hello,world,helloworld

在这里插入图片描述

List<Employee> list = new ArrayList<>();
list.add(new Employee("张三", 33));
list.add(new Employee("李四", 28));
list.add(new Employee("王五", 25));
list.add(new Employee("赵六", 40));
list.add(new Employee("孙七", 18));
String nameList = list.stream().collect(Collectors.mapping(Employee::getName, Collectors.joining(",")));
System.out.println(nameList);
//输出结果
张三,李四,王五,赵六,孙七

在这里插入图片描述

Employee employee = list.stream().collect(Collectors.minBy(Comparator.comparingInt(Employee::getAge))).get();
System.out.println(employee);
//输出结果
Employee(name=孙七, age=18)

在这里插入图片描述

Employee employee = list.stream().collect(Collectors.maxBy(Comparator.comparingInt(Employee::getAge))).get();
System.out.println(employee);
//输出结果
Employee(name=赵六, age=40)

在这里插入图片描述

long sum = list.stream().collect(Collectors.summarizingInt(Employee::getAge)).getSum();
System.out.println(sum);
//输出结果
144

在这里插入图片描述

Double avgAge = list.stream().collect(Collectors.averagingInt(Employee::getAge));
System.out.println(avgAge);
//输出结果
28.8

在这里插入图片描述

List<Employee> list = new ArrayList<>();
list.add(new Employee("张三", 20));
list.add(new Employee("李四", 20));
list.add(new Employee("王五", 30));
list.add(new Employee("赵六", 30));
list.add(new Employee("孙七", 40));
Map<Integer, List<Employee>> employeeMap = list.stream().collect(Collectors.groupingBy(Employee::getAge));
for (Integer age : employeeMap.keySet()) {
    System.out.println(age+"年龄组有");
    employeeMap.get(age).stream().forEach(System.out::println);
}
//输出结果
20年龄组有
Employee(name=张三, age=20)
Employee(name=李四, age=20)
40年龄组有
Employee(name=孙七, age=40)
30年龄组有
Employee(name=王五, age=30)
Employee(name=赵六, age=30)

在这里插入图片描述

List<Employee> list = new ArrayList<>();
list.add(new Employee("张三", 33));
list.add(new Employee("李四", 28));
list.add(new Employee("王五", 25));
list.add(new Employee("赵六", 40));
list.add(new Employee("孙七", 18));
//年龄是否大于30
Map<Boolean, List<Employee>> employeeMap = list.stream().collect(Collectors.partitioningBy(k -> k.getAge().compareTo(30) > 0));
for (Boolean b : employeeMap.keySet()) {
    System.out.println(b ? "大于30的有" : "小于30的有");
    employeeMap.get(b).stream().forEach(System.out::println);
}
//输出结果
小于30的有
Employee(name=李四, age=28)
Employee(name=王五, age=25)
Employee(name=孙七, age=18)
大于30的有
Employee(name=张三, age=33)
Employee(name=赵六, age=40)

在这里插入图片描述

List<Employee> list = new ArrayList<>();
list.add(new Employee("张三", 33));
list.add(new Employee("李四", 28));
list.add(new Employee("王五", 25));
list.add(new Employee("赵六", 40));
list.add(new Employee("孙七", 18));
//年龄是否大于30
Map<String, Employee> employeeMap = list.stream().collect(Collectors.toMap(k -> k.getName(), v -> v, (o1, o2) -> o1));
for (String name : employeeMap.keySet()) {
    System.out.println(name + "年龄是:" + employeeMap.get(name).getAge() + "岁");
}
//输出结果
孙七年龄是:18岁
李四年龄是:28岁
张三年龄是:33岁
王五年龄是:25岁
赵六年龄是:40

在这里插入图片描述

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

List<String> items = Arrays.asList("a","b","c","d","e");
items.forEach(item->System.out.println(item));
//输出 a,b,c,d,e

在这里插入图片描述

List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
String result = strings.stream().filter(str -> str.equals("dd"))
                .findAny()
                .orElse(null);
System.out.println(result);
//输出 dd

在这里插入图片描述

List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
String result = strings.stream().filter(str -> str.equals("dd"))
                .findFirst()
                .orElse(null);
System.out.println(result);
//输出 dd

在这里插入图片描述

List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
Boolean result = strings.stream().anyMatch(str -> str.equals("dd"));
System.out.println(result);
//输出 true

在这里插入图片描述

List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
Boolean result = strings.stream().allMatch(str -> str.equals("dd"));
System.out.println(result);
//输出 false

在这里插入图片描述

List<String> strings = Arrays.asList("abc", "dd", "DD", "dd", "abcd","cc", "jkl");
Boolean result = strings.stream().noneMatch(str -> str.equals("ff"));
System.out.println(result);
//输出 true

在这里插入图片描述

// 0代表初始值 如果不传0 则使用第一个元素作为初始值,acc是计算值,n 是每个元素
int sum = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9).reduce(0, (acc, n) -> acc + n);
System.out.println(sum); // 45

//不传初始值的情况下,返回的是Optional类型的结果
List<Integer> numList = Arrays.asList(1,2,3,4,5);
Optional<Integer> result = numList.stream().reduce((a, b) -> a + b);
System.out.println(result.get());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值