java8中stream流和Lambda的实现demo实例汇总

一、demo准备

实体类Employee

package dto;
import lombok.Data;
@Data
public class Employee {
    private Integer id;
    private String name;
    private Integer age;
    private Double weight;

    public Employee(Integer id,String name, Integer age, Double weight) {
        this.id=id;
        this.name = name;
        this.age = age;
        this.weight = weight;
    }
    public Employee() {
    }
}

service层
MyFunction普通接口

package service;

public interface MyFunction {
    public String getValue(String str);
}

MyPredicate带泛型的接口

package service;

public interface MyPredicate<T> {
    /**
     * 对传递过来的T类型的数据进行过滤
     * 符合规则返回true,不符合规则返回false
     */
    boolean filter(T t);
}

两个实现类impl:

1.比较年龄
package service.impl;

import dto.Employee;
import service.MyPredicate;

public class FilterEmployeeByAge implements MyPredicate<Employee>{
    public boolean filter(Employee employee) {
        return employee.getAge()>18;
    }
}

2.比较体重
package service.impl;

import dto.Employee;
import service.MyPredicate;

public class FilterEmployeeByWeight implements MyPredicate<Employee>{
    public boolean filter(Employee employee) {
        return employee.getWeight()>50;
    }
}

二、测试类tast

package tast;

import dto.Employee;
import service.MyPredicate;
import service.impl.FilterEmployeeByAge;
import service.impl.FilterEmployeeByWeight;
import service.MyFunction;
import java.util.*;
import java.util.stream.Collectors;

public class Test {
    protected List<Employee> arrayList =(List<Employee>) Arrays.asList(
            new Employee(1,"张三", 16, 99.99D),
            new Employee(2,"李四", 38, 55.55D),
            new Employee(4,"田七", 18, 49.33D),
            new Employee(3,"王五", 60, 66.66D),
            new Employee(5,"赵六", 16, 77.77D),
            new Employee(6,"",19,50D),
            new Employee(7,"孙悟空",99,99999.0D),
            new Employee(7,"齐天大圣",99,99999.0D)
    );
    /*
    * 优化方案1
    * */
    public List<Employee> filterEmployee(List<Employee> list, MyPredicate<Employee> myPredicate){
        List<Employee> employees = new ArrayList<Employee>();
        for(Employee e : list){
            if(myPredicate.filter(e)){
                employees.add(e);
            }
        }
        return employees;
    }
    @org.junit.Test
    public void test1() {
        ArrayList<Employee> employees=new ArrayList<Employee>();
        for (Employee employee:arrayList) {
            if(employee.getAge()>18){
                employees.add(employee);
            }
        }
        System.out.println("年龄大于18的:"+employees);
        employees=new ArrayList<Employee>();
        for (Employee employee:arrayList) {
            if(employee.getWeight()>50){
                employees.add(employee);
            }
        }
        System.out.println("体重大于50的:"+employees);


        List<Employee> employeeList = this.filterEmployee(arrayList, new FilterEmployeeByAge());
        System.out.println("年龄大于18的:");
        for (Employee employee:employeeList) {
            System.out.println(employee);
        }
        System.out.println("体重大于50的:");
        employeeList=this.filterEmployee(arrayList,new FilterEmployeeByWeight());
        for (Employee employee:employeeList) {
            System.out.println(employee);
        }

    }
    /*
    *
    * 方案2使用内部类
    * */
    @org.junit.Test
    public void test2(){
        List<Employee> employees = this.filterEmployee(arrayList, new MyPredicate<Employee>() {
            public boolean filter(Employee employee) {
                return employee.getAge() > 18;
            }
        });
        for (Employee employee:employees) {
            System.out.println(employee);
        }
    }
    /*
    * 方案3使用Lambda
    * */
    @org.junit.Test
    public void test3(){
        filterEmployee(arrayList,(e)->e.getAge()>18).forEach(System.out::println);
    }
    /*
    * 方案4使用Stream API
    * limit
    * */
    @org.junit.Test
    public void test4(){
        arrayList.stream().filter(employee -> employee.getAge()>18).forEach(System.out::println);
        //限制几名
        arrayList.stream().filter(employee -> employee.getWeight()>50).limit(2).forEach(System.out::println);
    }
    /*
    * 拿取实体类的个别属性
    *
    * */
    @org.junit.Test
    public void test5(){
        arrayList.stream().filter(employee -> employee.getAge() > 18).map(Employee::getName).forEach(System.out::println);
        arrayList.stream().filter(employee -> employee.getWeight()>50).map(Employee::getName).forEach(System.out::append);
    }
    /*
    * 先比较年龄,如果年龄相同再比较姓名
    * */
    @org.junit.Test
    public void test6(){
        Collections.sort(
                arrayList,(e1,e2)->{
                    if(e1.getAge()==e2.getAge()){
                        return e1.getName().compareTo(e2.getName());
                    }
                    return Integer.compare(e1.getAge(),e2.getAge());
                    //如果想实现倒叙的排序,直接在Integer前加-
                    //return -Integer.compare(e1.getAge(),e2.getAge());
                }
        );
        arrayList.stream().forEach(System.out::println);
    }
    public String stringHander(String str, MyFunction myFunction){
        return myFunction.getValue(str);
    }
    /*
    * 大小写,截取
    * */
    @org.junit.Test
    public void test7(){
        String str = stringHander("wuchengen", e -> e.toUpperCase());
        System.out.println(str);
        String subStr = stringHander("wuchengen", e -> e.substring(0,5));
        System.out.println(subStr);

    }
    /*
    * 排序
    * */
    @org.junit.Test
    public void test8(){
        List<Employee> employees = arrayList.stream().sorted(Comparator.comparing(Employee::getAge)).collect(Collectors.toList());
        employees.stream().forEach(System.out::println);
    }
    /*
    * 字符串返回结果
    * */
    @org.junit.Test
    public void test9(){
        String str = arrayList.stream().filter(employee -> employee.getAge() > 18).map(Employee::getName).collect(Collectors.joining(","));
        System.out.println(str);
    }
    /*
    *聚合函数的应用
    * */
    @org.junit.Test
    public void test10(){
        long count = arrayList.stream().filter(employee -> employee.getName().isEmpty()).count();
        IntSummaryStatistics intSummaryStatistics = arrayList.stream().mapToInt(Employee::getAge).summaryStatistics();
        int max = intSummaryStatistics.getMax();
        int min = intSummaryStatistics.getMin();
        long sum = intSummaryStatistics.getSum();
        double average = intSummaryStatistics.getAverage();
        System.out.println("姓名为空的人数:"+count);
        System.out.println("最大的年龄:"+max);
        System.out.println("最小的年龄:"+min);
        System.out.println("年龄和:"+sum);
        System.out.println("平均年龄:"+average);
        List<Employee> employees = arrayList.stream().filter(employee -> employee.getAge() == min).collect(Collectors.toList());
        System.out.println("最小年龄的员工信息"+employees);
    }
    /*
    * 其中map有三种构造方法的重载:
    * 正常的key-value结构
    * toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);
    * key存在冲突时,解决方案
    * toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction);
    * 第四个参数是排序的方式
    * toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);
    * */
    @org.junit.Test
    public void test11(){
        //得到姓名中包含"三"的人的姓名和员工号
        Map<Integer, String> map = arrayList.stream().filter(employee -> employee.getName().contains("三")).collect(Collectors.toMap(Employee::getId, Employee::getName));
        System.out.println(map);
        //若key存在冲突那么,可以调用tomap的第二个重载方式
        Map<Integer, String> map2 = arrayList.stream().collect(Collectors.toMap(Employee::getId, Employee::getName, (n, m) -> n +","+m));
        System.out.println(map2);
        //tomap四个参数,第四个参数是排序方式
        Map<Integer, String> map3 = arrayList.stream().collect(Collectors.toMap(Employee::getId, Employee::getName, (n, m) -> n +","+m,TreeMap::new));
        System.out.println(map3);
    }
}

三、输出测试结果

  1. 优化方案1

年龄大于18的:[Employee(id=2, name=李四, age=38, weight=55.55), Employee(id=3, name=王五, age=60, weight=66.66), Employee(id=6, name=, age=19, weight=50.0), Employee(id=7, name=孙悟空, age=99, weight=99999.0), Employee(id=7, name=齐天大圣, age=99, weight=99999.0)]
体重大于50的:[Employee(id=1, name=张三, age=16, weight=99.99), Employee(id=2, name=李四, age=38, weight=55.55), Employee(id=3, name=王五, age=60, weight=66.66), Employee(id=5, name=赵六, age=16, weight=77.77), Employee(id=7, name=孙悟空, age=99, weight=99999.0), Employee(id=7, name=齐天大圣, age=99, weight=99999.0)]
年龄大于18的:
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)
体重大于50的:
Employee(id=1, name=张三, age=16, weight=99.99)
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=5, name=赵六, age=16, weight=77.77)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)

  1. 方案2使用内部类

Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)

  1. 方案3使用Lambda

Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)

  1. 方案4使用Stream API

Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)
Employee(id=1, name=张三, age=16, weight=99.99)
Employee(id=2, name=李四, age=38, weight=55.55)

  1. 拿取实体类的个别属性

李四
王五

孙悟空
齐天大圣
张三李四王五赵六孙悟空齐天大圣

  1. 先比较年龄,如果年龄相同再比较姓名

Employee(id=1, name=张三, age=16, weight=99.99)
Employee(id=5, name=赵六, age=16, weight=77.77)
Employee(id=4, name=田七, age=18, weight=49.33)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)

  1. 大小写,截取

WUCHENGEN
wuche

  1. 排序按照年龄排序的)

Employee(id=1, name=张三, age=16, weight=99.99)
Employee(id=5, name=赵六, age=16, weight=77.77)
Employee(id=4, name=田七, age=18, weight=49.33)
Employee(id=6, name=, age=19, weight=50.0)
Employee(id=2, name=李四, age=38, weight=55.55)
Employee(id=3, name=王五, age=60, weight=66.66)
Employee(id=7, name=孙悟空, age=99, weight=99999.0)
Employee(id=7, name=齐天大圣, age=99, weight=99999.0)

  1. 字符串返回结果

李四,王五,孙悟空,齐天大圣

  1. 聚合函数的应用

姓名为空的人数:1
最大的年龄:99
最小的年龄:16
年龄和:365
平均年龄:45.625
最小年龄的员工信息
[Employee(id=1, name=张三, age=16, weight=99.99), Employee(id=5, name=赵六, age=16, weight=77.77)]

  1. 其中map有三种构造方法的重载

{1=张三}
{1=张三, 2=李四, 3=王五, 4=田七, 5=赵六, 6=, 7=孙悟空,齐天大圣}
{1=张三, 2=李四, 3=王五, 4=田七, 5=赵六, 6=, 7=孙悟空,齐天大圣}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值