基于list stream: reduce的使用实例

 更新时间:2021年09月09日 08:45:06   作者:有梦想的攻城狮  
这篇文章主要介绍了list stream: reduce的使用实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

list stream: reduce的使用

stream 中的 reduce 的主要作用就是stream中元素进行组合,组合的方式可以是加减乘除,也可以是拼接等,接下来我们就通过实例来看一下reduce的用法:

reduce 一共有三种实现

1、第一种

T reduce(T identity, BinaryOperator accumulator);

该实现有起始值 identity, 起始值的类型决定了返回结果的类型,通过 accumulator 操作最终得到 identity 类型的返回结果

2、第二种

Optional<T> reduce(BinaryOperator accumulator);

该实现只有一个参数 accumulator , 由于没有办法确定具体的返回结果,所以该方法返回的是 Optional

3、第三种

<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);

该方法有三个参数 identity 、 accumulator 、combiner ,该方法通过 identity 和 accumulator的处理得出最终结果,结果和第一个参数的类型相同

首先把我们下面操作的这个实体对象先放在这里

pulbic class User {
  //ID
  private Long id;
  //年龄
  private int age;
  //班级
  private String classes;
  public Long getId() {
    return id;
  }
  public void setId(Long id) {
    this.id = id;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getClasses() {
    return classes;
  }
  public void setClasses(String classes) {
    this.classes = classes;
  }
  @Override
  public String toString() {
    return "User{" +
      "id=" + id +
      ", age=" + age +
      ", classes='" + classes + '\'' +
      '}';
  }

用来求和,如下所示是四种不同的方式来获取User对象中的age只和,其中两种是通过reduce来进行求和

List<User> userList = new ArrayList<>();
    User user1 = new User();
    user1.setAge(10);
    userList.add(user1);
    User user2 = new User();
    user2.setAge(20);
    userList.add(user2);
    User user3 = new User();
    user3.setAge(25);
    userList.add(user3);
    int ageSumThree = userList.stream().map(User::getAge).reduce(0, Integer::sum);
    System.out.println("ageSumThree: "  + ageSumThree);
    int ageSumFive = userList.stream().map(User::getAge).reduce(Integer::sum).orElse(0);
    System.out.println("ageSumFive: "  + ageSumFive);
    int ageSumOne = userList.stream().collect(Collectors.summingInt(User::getAge));
    System.out.println("ageSumOne" + ageSumOne);
    int ageSumFour = userList.stream().mapToInt(User::getAge).sum();
    System.out.println("ageSumFour: "  + ageSumFour);

用来求最大最小值,如下所示是求User中age的最大最小值

public static void main(String[] args) {
List<User> userList = new ArrayList<>();
    User user1 = new User();
    user1.setAge(10);
    userList.add(user1);
    User user2 = new User();
    user2.setAge(20);
    userList.add(user2);
    User user3 = new User();
    user3.setAge(25);
    userList.add(user3);
    User user4 = new User();
    user4.setAge(25);
    userList.add(user4);
    int min = userList.stream().map(User::getAge).reduce(Integer::min).orElse(0);
    System.out.println("min : " + min);
    int max = userList.stream().map(User::getAge).reduce(Integer::max).orElse(0);
    System.out.println("max : " + max);
}

用来拼接字符串,如下所示:

public static void main(String[] args) {
List<User> userList = new ArrayList<>();
    User user1 = new User();
    user1.setAge(10);
    userList.add(user1);
    User user2 = new User();
    user2.setAge(20);
    userList.add(user2);
    User user3 = new User();
    user3.setAge(25);
    userList.add(user3);
    User user4 = new User();
    user4.setAge(25);
    userList.add(user4);
    String append = userList.stream().map(User::toString).reduce("拼接字符串:", String::concat);
    System.out.println("append : " + append);
}

计算平均值:计算User对象中age字段的平均值

public static void main(String[] args) {
List<User> userList = new ArrayList<>();
    User user1 = new User();
    user1.setAge(10);
    userList.add(user1);
    User user2 = new User();
    user2.setAge(20);
    userList.add(user2);
    User user3 = new User();
    user3.setAge(25);
    userList.add(user3);
    User user4 = new User();
    user4.setAge(25);
    userList.add(user4);
    double average = userList.stream().mapToInt(User::getAge).average().orElse(0.0);
    System.out.println("average : " + average);
}

reduce的基本用法

1、初识 reduce 的基本 api

    @Test
    public void testReduce() {
        Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8});
        //求集合元素只和
        Integer result = stream.reduce(0, Integer::sum);
        System.out.println(result);
        stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
        //求和
        stream.reduce((i, j) -> i + j).ifPresent(System.out::println);
        stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
        //求最大值
        stream.reduce(Integer::max).ifPresent(System.out::println);
        stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
        //求最小值
        stream.reduce(Integer::min).ifPresent(System.out::println);
        stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
        //做逻辑
        stream.reduce((i, j) -> i > j ? j : i).ifPresent(System.out::println);
        stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
        //求逻辑求乘机
        int result2 = stream.filter(i -> i % 2 == 0).reduce(1, (i, j) -> i * j);
        Optional.of(result2).ifPresent(System.out::println);
    }

2、应用场景测试

求所有学生的成绩之和。

package com.jd;
import com.jd.bean.Score;
import com.jd.bean.Student;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
/**
 * @author: wangyingjie1
 * @version: 1.0
 * @createdate: 2017-09-26 09:35
 */
public class ReduceTest {
    @Test
    public void reduceList() {
        List<Student> list = getStudents();
        //使用Reduce 将所有的所有的成绩进行加和
        Optional<Score> totalScore = list.stream()
                .map(Student::getScore)
                .reduce((x, y) -> x.add(y));
        System.out.println(totalScore.get().getPoint());
    }
    @Test
    public void reduceList2() {
        List<Student> list = getStudents();
        Student student = getStudent();
        //使用Reduce 求 list 、student 的总成绩之和
        Score scoreSum = list.stream()
                .map(Student::getScore)
                //相当于加了一个初始值
                .reduce(student.getScore(), (x, y) -> x.add(y));
        System.out.println(scoreSum.getPoint());
    }
    private Student getStudent() {
        Student student = new Student();
        student.setId(4);
        Score score = new Score();
        score.setPoint(100);
        student.setScore(score);
        return student;
    }
    private List<Student> getStudents() {
        List<Student> list = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Student stu = new Student();
            Score score = new Score();
            score.setPoint(80);
            score.setCourseName("English");
            stu.setId(i);
            stu.setScore(score);
            list.add(stu);
        }
        return list;
    }
}
package com.jd.bean;
//学生
public class Student {
    private Integer id;
    //课程分数
    private Score score;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Score getScore() {
        return score;
    }
    public void setScore(Score score) {
        this.score = score;
    }
}
package com.jd.bean;
//课程分数
public class Score {
    //分数
    private Integer point;
    //课程名称
    private String courseName;
    public Integer getPoint() {
        return point;
    }
    public Score add(Score other) {
        this.point += other.getPoint();
        return this;
    }
    public void setPoint(Integer point) {
        this.point = point;
    }
    public String getCourseName() {
        return courseName;
    }
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 数据同步利器DataX简介及如何使用

    数据同步利器DataX简介及如何使用

    DataX 是阿里云 DataWorks数据集成 的开源版本,使用Java 语言编写,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台,今天给大家分享一个阿里开源的数据同步工具DataX,在Github拥有14.8k的star,非常受欢迎
    2024-02-02
  • Java设计模式之策略模式示例详解

    Java设计模式之策略模式示例详解

    这篇文章主要为大家详细介绍了Java的策略模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java实现前端jsencrypt.js加密后端解密的示例代码

    Java实现前端jsencrypt.js加密后端解密的示例代码

    这篇文章主要为大家详细介绍了如何利用jsencrypt.js实现前端加密,利用Java实现后端解密的功能,文中的示例代码讲解详细,需要的可以参考一下
    2022-09-09
  • 利用Spring Cloud Zuul实现动态路由示例代码

    利用Spring Cloud Zuul实现动态路由示例代码

    Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。下面这篇文章主要给大家介绍了关于利用Spring Cloud Zuul实现动态路由的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • 掌握模块化开发Spring Boot子模块使用技巧

    掌握模块化开发Spring Boot子模块使用技巧

    这篇文章主要为大家介绍了掌握模块化开发Spring Boot子模块使用技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java TreeSet类的简单理解和使用

    Java TreeSet类的简单理解和使用

    这篇文章主要介绍了Java TreeSet类的简单理解和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • JPA如何使用findBy方法自定义查询

    JPA如何使用findBy方法自定义查询

    这篇文章主要介绍了JPA如何使用findBy方法自定义查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java简单读取properties配置文件的方法示例

    java简单读取properties配置文件的方法示例

    这篇文章主要介绍了java简单读取properties配置文件的方法,涉及java针对properties配置的载入及文件属性读取相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • Java分布式锁理论(redis、zookeeper))案例详解

    Java分布式锁理论(redis、zookeeper))案例详解

    zookeeper有个节点路径的概念,节点路径不能重复,保证了唯一性,这篇文章给大家介绍Java分布式锁理论(redis、zookeeper) 案例详解,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法

    IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法

    在IDEA中就提供了一个帮助你回退代码的机会,但这个方法并不是万能的,好了,下面就来具体说说IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法,感兴趣的朋友一起看看吧
    2022-04-04

最新评论