Stream聚合函数

Stream班介绍

幼稚园开学的第一天,各们家长把小朋友送到了园里,各位小朋友都你看看我,我看看你。有的嚎啕大哭,有的呆若木鸡....这里时候园长安排我拿来小本本记录入园的小朋友....

记录小朋友

身为程序员的我当然不会拿笔来记录了。我准备代码来记录下、先写小孩子的类Child在映射基本信息

@Getter
@Setter
@NoArgsConstructor
public class Child {

    private int age;         //年龄
    private String firstName; //名
    private String lastName; //姓
    private String fullName; //全名
    
    Child(int age, String lastName, String firstName) {
        this.age = age;
        this.lastName = lastName;
        this.firstName = firstName;
        this.fullName = lastName + firstName;
    }
}

在创建一个班名册类ClassBook来记录Stream班的入园所有学生!

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ClassBook {
    private String name = "Stream班名册"; //班名册记录
    private List<Child> kids = new LinkedList<>();//名册表
}

由于YQ的原因,我们园小班只收了10个小朋友,现在的小朋友可了不得,光这名儿起的就有文化,我先把这些小朋友记录下来再说!

public class StreamMathApiTest {
    private ClassBook book;
    @Before
    public void __setUp() {
        List<Child> allChild = new LinkedList<>();
        allChild.add(new Child(3.0F, "萧", "峰"));
        allChild.add(new Child(3.1F, "任", "我行"));
        allChild.add(new Child(3.2F, "郭", "靖"));
        allChild.add(new Child(3.5F, "洪", "七公"));
        allChild.add(new Child(3.6F, "黄", "药师"));
        allChild.add(new Child(3.9F, "欧", "阳峰"));
        allChild.add(new Child(3.4F, "任", "飞燕"));
        allChild.add(new Child(3.7F, "杨", "过"));
        allChild.add(new Child(3.3F, "杨", "逍"));
        allChild.add(new Child(3.8F, "石", "破天"));
        this.book = new ClassBook("Stream班名册", allChild);
    }
}

还是写程序快啊,不用做Excel表格,一个一个输入。

计算总学生(Count)

刚把这些小学生记录完,还没歇着,园长就让我们汇报下今天一共入园了多少学生~,等待哈,我先跑个代码看一看!

@Test
public void test_count() {
  //count 函数
  long count = this.book.getKids().stream().
    count();

  Assert.assertTrue(count == 10l);
}

这不,能让电脑动的我决不动脑子。一个就算出个10来。我赶紧向园长汇报!园长跨我算的快!刚准备喝口水、园让又让我计算下我们班平均年龄!!!没办法,我再写个程序!

计算平均年龄(mapTo(xxx) + Avgage)

@Test
public void test_avg() {
  double avgAge = this.book.getKids().
    stream().
    mapToDouble(Child::getAge).
    average().orElse(0l);

  Assert.assertEquals("Error calc!", "3.45", Double.toString(avgAge));
}

程序真是个好东西,你看不用一个一个输入,我写好代码,它自动跑出结果就行!帮我算出了平均数为3.45,这不,园长真的再次跨我能干!笑着说:顺便给我算下咱们班最大的年龄是多少!、我一脸无耐。

计算最大/小值(Max/Min)

@Test
public void test_max() {
  //最大值
  Child maxChild = this.book.getKids().stream().
    max((o1, o2) -> {
      //借助BigDecimal函数来比较,也可以把Float转成int来进行比较,方法很多种。
      BigDecimal first = new BigDecimal(String.valueOf(o1.getAge()));
      BigDecimal second = new BigDecimal(String.valueOf(o2.getAge()));
      return first.compareTo(second);
    }).get();

  Assert.assertEquals("欧阳峰", maxChild.getFullName());


  //最小值 返回过来即可
  Child minChild = this.book.getKids().stream().
    max((o1, o2) -> {
      BigDecimal first = new BigDecimal(String.valueOf(o1.getAge()));
      BigDecimal second = new BigDecimal(String.valueOf(o2.getAge()));
      return second.compareTo(first);
    }).get();
  Assert.assertEquals("萧峰", minChild.getFullName());
}

反正不用我一个一个计算,我就做个顺水人情,顺便把咱们班最小的朋友也给您找出来!省的你还让我回来算!这不,最大的是

欧阳峰/3岁9个月,最小是的萧峰/3岁挂0、心想这下都给你整明白了吧!应该不用算啥了吧!这不刚想完,就让我回来再算下总年龄!

我...好人做到底,送佛送到西!我就再写一手!

累加(reduce)

@Test
public void test_reduce() {
  Float totalAge = this.book.getKids().stream().
    map(Child::getAge)
    .reduce(0f, Float::sum);
		
  	//Double::sum/Interge::sum/......
  
  Assert.assertEquals(totalAge.toString(), "34.5");
}

算出来了!这加减乘除平均数最大最小都给你整出来了,这下没有啥要计算了的吧!

好了、今天的Stream教程到此结束!下次待园长吩咐了才做!

代码在GitHub

posted @ 2021-09-28 23:25  乌托拉赛文  阅读(593)  评论(1编辑  收藏  举报