栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java8Stream

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java8Stream

文章目录
    • Stream
      • 中间操作
        • filter
        • limit
        • skip
        • distinct
        • map
        • flatMap
        • sort
      • 终止操作
        • allMatch
        • anyMatch
        • noneMatch
        • findFirst 和 findAny
        • count、max和min
        • reduce
        • collect

记录下java的一些Stream用法。。。

Stream

用来测试的类 Employee

public class Employee {
    private String name;  // 姓名
    private int salary; // 薪资
    private int age; // 年龄
    private String sex; //性别
    private String area;  // 地区
    private Status status;

    public Employee() {
    }

    public Employee(String name, int salary, int age, String sex, String area) {
        this.name = name;
        this.salary = salary;
        this.age = age;
        this.sex = sex;
        this.area = area;
    }

    public Employee(String name, int salary, int age, String sex, String area, Status status) {
        this.name = name;
        this.salary = salary;
        this.age = age;
        this.sex = sex;
        this.area = area;
        this.status = status;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        return salary == employee.salary &&
                age == employee.age &&
                Objects.equals(name, employee.name) &&
                Objects.equals(sex, employee.sex) &&
                Objects.equals(area, employee.area);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, salary, age, sex, area);
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + ''' +
                ", salary=" + salary +
                ", age=" + age +
                ", sex='" + sex + ''' +
                ", area='" + area + ''' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public enum  Status{
        FREE,BUSY,VOCATION
    }
}

初始化测试对象

List emps = Arrays.asList(
     new Employee("张三", 10000, 25, "男", "海南", Employee.Status.FREE),
     new Employee("李四", 20000, 26, "女", "浙江", Employee.Status.BUSY),
     new Employee("王五", 15000, 28, "男", "海南", Employee.Status.VOCATION),
     new Employee("赵六", 15600, 28, "男", "海南", Employee.Status.FREE),
     new Employee("赵六", 20000, 51, "女", "广东", Employee.Status.VOCATION));"));
中间操作 filter
  
@Test  
public void test1() {  
   Stream stream = list.stream().filter((e) -> e.getAge() > 25);    
   stream.forEach(System.out::println);  
}

结果:
Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}
Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}
limit
@Test
public void test2() {
    Stream stream = emps.stream().limit(1);
    stream.forEach(System.out::println);
}

结果:
Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}
skip
@Test
public void test3() {
    Stream stream = emps.stream().skip(2);
    stream.forEach(System.out::println);
}

结果:
Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}
distinct
@Test
public void test4() {
    emps.stream().distinct().forEach(System.out::println);
}

map
    @Test
    public void test5() {
        List strs = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
        strs.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);

        System.out.println("------------------------");

        emps.stream().map((e) -> e.getName()).forEach(System.out::println);
        emps.stream().map(Employee::getName).forEach(System.out::println);

        System.out.println("------------------------");

        // map中处理的是aaa,bbb,ccc每次传入的,然后返回一个流,于是就返回了多个流,放入一个流中
        Stream> stream = strs.stream().map(TestStreamApi::filterCharacter);
        stream.forEach((s) -> s.forEach(System.out::println));

    }

    public static Stream filterCharacter(String str) {
        ArrayList list = new ArrayList<>();
        for (Character c : str.toCharArray()) {
            list.add(c);
        }
        return list.stream();
    }
flatMap
@Test
public void test6() {
    List strs = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
    Stream stream = strs.stream().flatMap(TestStreamApi::filterCharacter);
    stream.forEach(System.out::println);
}

结果:
a
a
a
b
b
b
c
c
c
d
d
d
e
e
e
sort
@Test
public void test7() {
    List strs = Arrays.asList("ccc", "eee", "aaa", "ddd", "bbb");
    strs.stream().sorted().forEach(System.out::println);

    System.out.println("-------------------");
    Stream stream = emps.stream().sorted((e1, e2) -> {
        if (e1.getAge() == e2.getAge()) {
            return e1.getName().compareTo(e2.getName());
        } else {
            return e1.getAge();
        }
    });
    stream.forEach(System.out::println);
}

结果:
aaa
bbb
ccc
ddd
eee
-------------------
Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}
Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}
Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}
Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}
终止操作 allMatch
@Test
public void test() {
    boolean b = emps.stream().allMatch(employee -> employee.getStatus().equals(Employee.Status.BUSY));
    System.out.println(b);
}

结果:
false
anyMatch
@Test
public void test2() {
    boolean b = emps.stream().anyMatch(e -> e.getStatus().equals(Employee.Status.BUSY));
    System.out.println("b = " + b);
}

结果:
b=true
noneMatch
    @Test
    public void test3() {
        boolean b = emps.stream().noneMatch(e -> e.getStatus().equals(Employee.Status.BUSY));
        System.out.println("b = " + b);

    }

结果:
b = false
findFirst 和 findAny
    @Test
    public void test4() {
        Optional op = emps.stream()
                .sorted((e1, e2) -> -Double.compare(e1.getSalary(), e2.getSalary()))
                .findFirst();
        System.out.println("employee = " + op.get());

        System.out.println("-----------------");
        Optional op1 = emps.parallelStream().filter(e -> e.getStatus().equals(Employee.Status.FREE)).findAny();
        System.out.println("employee1 = " + op1.get());
    }

结果:
employee = Employee{name='002', salary=20000, age=26, sex='女', area='浙江'}
-----------------
employee1 = Employee{name='003', salary=15600, age=28, sex='男', area='海南'}
count、max和min
    @Test
    public void test5() {
        long count = emps.stream().count();
        System.out.println("count = " + count);

        Optional op = emps.stream().max((e1, e2) -> Integer.compare(e1.getAge(), e2.getAge()));
        System.out.println("op = " + op.get());

        Optional op1 = emps.stream().min((e1, e2) -> Integer.compare(e1.getAge(), e2.getAge()));
        System.out.println("op1 = " + op1.get());
    }

结果:
count = 4
op = Employee{name='004', salary=15000, age=28, sex='男', area='海南'}
op1 = Employee{name='001', salary=10000, age=25, sex='男', area='海南'}
reduce
    @Test
    public void test() {
        List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        // 将参数1 identity作为x,将list中的元素作为y,执行x+y,在将结果作为x,list中的下一个元素作为y反复执行
        Integer sum = list.stream().reduce(1, (x, y) -> x + y);
        System.out.println("sum = " + sum);

        System.out.println("-------------------");
        Integer sum2 = emps.stream().map(Employee::getSalary).reduce(0, (x, y) -> x + y);
        System.out.println("sum2 = " + sum2);

        Optional op = emps.stream().map(Employee::getSalary).reduce(Integer::sum);
        System.out.println("op.get() = " + op.get());
    }

结果:
sum = 56
-------------------
sum2 = 80600
op.get() = 80600
collect
    @Test
    public void test2() {
        List list = emps.stream().map(Employee::getName).collect(Collectors.toList());
        for (String s : list) {
            System.out.println(s);
        }

        System.out.println("---------------------------------");
        Set set = emps.stream().map(Employee::getName).collect(Collectors.toSet());
        set.forEach(System.out::println);

        System.out.println("--------------总数-------------------");
        Long count = emps.stream().collect(Collectors.counting());
        System.out.println("count = " + count);

        System.out.println("--------------平均数-------------------");
        Double average = emps.stream().collect(Collectors.averagingInt(Employee::getAge));
        System.out.println("average = " + average);
    }

结果:
张三
李四
王五
赵六
赵六
---------------------------------
李四
张三
王五
赵六
--------------总数-------------------
count = 5
--------------平均数-------------------
average = 31.6
// 分组
    @Test
    public void test3() {
        Map> map = emps.stream().collect(Collectors.groupingBy(e -> e.getStatus()));
        Map> map1 = emps.stream().collect(Collectors.groupingBy(Employee::getStatus));
        System.out.println("map = " + map);
        System.out.println("map1 = " + map1);
    }

结果:
map = {FREE=[Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}, Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}], VOCATION=[Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}, Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}], BUSY=[Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}]}
map1 = {FREE=[Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}, Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}], VOCATION=[Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}, Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}], BUSY=[Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}]}
// 多级分组
    @Test
    public void test4() {
        Map>> map = emps.stream().collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy((e) -> {
                    if (e.getAge() <= 35) {
                        return "青年";
                    } else if (e.getAge() <= 50) {
                        return "中年";
                    } else {
                        return "老年";
                    }
                }
        )));
        System.out.println("map = " + map);
    }

结果:
map = {VOCATION={青年=[Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}], 老年=[Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}]}, BUSY={青年=[Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}]}, FREE={青年=[Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}, Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}]}}
// 分片
    @Test
    public void test5() {
        Map> map = emps.stream().collect(Collectors.partitioningBy(e -> e.getSalary() > 20000));
        System.out.println("map = " + map);
    }

结果:
map = {false=[Employee{name='张三', salary=10000, age=25, sex='男', area='海南'}, Employee{name='李四', salary=20000, age=26, sex='女', area='浙江'}, Employee{name='王五', salary=15000, age=28, sex='男', area='海南'}, Employee{name='赵六', salary=15600, age=28, sex='男', area='海南'}, Employee{name='赵六', salary=20000, age=51, sex='女', area='广东'}], true=[]}
// 连接
    @Test
    public void test6() {
        String s = emps.stream()
                .map(Employee::getName).collect(Collectors.joining(","));
        System.out.println("s = " + s);
    }

结果:
s = 张三,李四,王五,赵六,赵六

关于stream使用暂时记录到这,后续遇到的也记录进来

可以看看我的学习——基于Hexo的个人博客:
网站:http://www.fuzm.wang
—————————————————————————
作为初学者,很多知识都没有掌握,见谅,如有错误请指出,以期进步,感谢!。后续有新的学习,继续补充上来。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031827.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号