Table of Contents
ToggleJava Collectors Class
允許對 Stream 實例中保存的資料元素執行操作,例如: 將計算元素屬性的平均數、彙整統計等, 此操作的策略是通過 Collector 接口實現提供的,提供了許多靜態方法運用,介紹常見的 averagingInt 、 summarizingLong 等方法, Collectors Class 本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- datetime
| +- collectors
| +- CollectorsClassTest.java
單元測試
Collectors Class Java 提供計算平均數、彙整統計等操作集合中的元素。
Fruit
建立 Fruit 類別,覆寫 toString ,定義屬性和方法,用來建立一個物件。
@NoArgsConstructor
@Getter
@Setter
@Builder
public static class Fruit {
private String name;
private double quantity;
private int type;
public Fruit(String name, double quantity, int type) {
this.name = name;
this.quantity = quantity;
this.type = type;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
builder.appendSuper(super.toString());
builder.append("name", name);
builder.append("quantity", quantity);
builder.append("type", type);
return builder.toString();
}
}
averagingInt
Collectors Class Java 建立一個 List ,內有三個元素,計算元素屬性平均數。
@Test
public void averagingInt() {
List<Integer> list = Arrays.asList(1, 2, 3);
Double result = list.stream().collect(Collectors.averagingInt(e -> e));
System.out.println(result);
assertEquals(2.00, result.doubleValue(), 2);
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", Double.MAX_VALUE, 1), new Fruit("Melon", -1, 3),
new Fruit("Fig", 3, 1));
Double fruitResult = fruitList.stream().collect(Collectors.averagingInt(e -> e.getName().length()));
System.out.println(fruitResult);
assertEquals(5.66, fruitResult.doubleValue(), 2);
}
2.0
5.666666666666667
averagingLong
Collectors Class Java 建立一個 List ,內有三個元素,計算元素屬性平均數。
@Test
public void averagingLong() {
List<Long> list = Arrays.asList(1L, 2L, 3L);
Double result = list.stream().collect(Collectors.averagingLong(e -> e));
System.out.println(result);
assertEquals(2.00, result.doubleValue(), 2);
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", Double.MAX_VALUE, 1), new Fruit("Melon", -1, 3),
new Fruit("Fig", 3, 1));
Double fruitResult = fruitList.stream().collect(Collectors.averagingLong(e -> e.getType()));
System.out.println(fruitResult);
assertEquals(1.66, fruitResult.doubleValue(), 2);
}
2.0
1.6666666666666667
averagingDouble
Collectors Class Java 建立一個 List ,內有三個元素,計算元素屬性平均數。
@Test
public void averagingDouble() {
List<Double> list = Arrays.asList(1d, 2d, 3d);
Double result = list.stream().collect(Collectors.averagingDouble(e -> e));
System.out.println(result);
assertEquals(2.00, result.doubleValue(), 2);
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", Double.MAX_VALUE, 1), new Fruit("Melon", -1, 3),
new Fruit("Fig", 3, 1));
Double fruitResult = fruitList.stream().collect(Collectors.averagingDouble(e -> e.getQuantity()));
System.out.println(fruitResult);
assertEquals(5.992310449541053E307, fruitResult.doubleValue(), 2);
}
2.0
5.992310449541053E307
summarizingInt
Collectors Class in Java 建立一個 List ,內有三個元素,彙整統計元素屬性。
@Test
public void summarizingInt() {
List<Integer> list = Arrays.asList(1, 2, 3);
IntSummaryStatistics result = list.stream().collect(Collectors.summarizingInt(e -> e));
System.out.println(result);
assertEquals(2.00, result.getAverage(), 2);
assertEquals(6, result.getSum());
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", 1, 1), new Fruit("Melon", 2, 3),
new Fruit("Fig", 3, 1));
IntSummaryStatistics fruitResult = fruitList.stream()
.collect(Collectors.summarizingInt(e -> e.getName().length()));
System.out.println(fruitResult);
assertEquals(5.66, fruitResult.getAverage(), 2);
assertEquals(17, fruitResult.getSum());
}
IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}
IntSummaryStatistics{count=3, sum=17, min=3, average=5.666667, max=9}
summarizingLong
Collectors Class in Java 建立一個 List ,內有三個元素,彙整統計元素屬性, Java Collectors Class Example 提供範例參考。
@Test
public void summarizingLong() {
List<Long> list = Arrays.asList(1L, 2L, 3L);
LongSummaryStatistics result = list.stream().collect(Collectors.summarizingLong(e -> e));
System.out.println(result);
assertEquals(2.00, result.getAverage(), 2);
assertEquals(6, result.getSum());
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", 1, 1), new Fruit("Melon", 2, 3),
new Fruit("Fig", 3, 1));
LongSummaryStatistics fruitResult = fruitList.stream().collect(Collectors.summarizingLong(e -> e.getType()));
System.out.println(fruitResult);
assertEquals(1.66, fruitResult.getAverage(), 2);
assertEquals(5, fruitResult.getSum());
}
LongSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}
LongSummaryStatistics{count=3, sum=5, min=1, average=1.666667, max=3}
summarizingDouble
Collectors Class in Java 建立一個 List ,內有三個元素,彙整統計元素屬性, Java Collectors Class Example 提供範例參考。
@Test
public void summarizingDouble() {
List<Double> list = Arrays.asList(1d, 2d, 3d);
DoubleSummaryStatistics result = list.stream().collect(Collectors.summarizingDouble(e -> e));
System.out.println(result);
assertEquals(2.00, result.getAverage(), 2);
assertEquals(6.00, result.getSum(), 2);
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", 1, 1), new Fruit("Melon", 2, 3),
new Fruit("Fig", 3, 1));
DoubleSummaryStatistics fruitResult = fruitList.stream()
.collect(Collectors.summarizingDouble(e -> e.getQuantity()));
System.out.println(fruitResult);
assertEquals(2.00d, fruitResult.getAverage(), 2);
assertEquals(6.00d, fruitResult.getSum(), 2);
}
DoubleSummaryStatistics{count=3, sum=6.000000, min=1.000000, average=2.000000, max=3.000000}
DoubleSummaryStatistics{count=3, sum=6.000000, min=1.000000, average=2.000000, max=3.000000}
CollectorsClassTest.java
Collectors Class in Java 新增單元測試,驗證 Java Collectors Class Example 是否符合預期。
package org.ruoxue.java_147.collector;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.DoubleSummaryStatistics;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.LongSummaryStatistics;
import java.util.stream.Collectors;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.junit.Test;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
public class CollectorsClassTest {
@NoArgsConstructor
@Getter
@Setter
@Builder
public static class Fruit {
private String name;
private double quantity;
private int type;
public Fruit(String name, double quantity, int type) {
this.name = name;
this.quantity = quantity;
this.type = type;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
builder.appendSuper(super.toString());
builder.append("name", name);
builder.append("quantity", quantity);
builder.append("type", type);
return builder.toString();
}
}
@Test
public void averagingInt() {
List<Integer> list = Arrays.asList(1, 2, 3);
Double result = list.stream().collect(Collectors.averagingInt(e -> e));
System.out.println(result);
assertEquals(2.00, result.doubleValue(), 2);
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", Double.MAX_VALUE, 1), new Fruit("Melon", -1, 3),
new Fruit("Fig", 3, 1));
Double fruitResult = fruitList.stream().collect(Collectors.averagingInt(e -> e.getName().length()));
System.out.println(fruitResult);
assertEquals(5.66, fruitResult.doubleValue(), 2);
}
@Test
public void averagingLong() {
List<Long> list = Arrays.asList(1L, 2L, 3L);
Double result = list.stream().collect(Collectors.averagingLong(e -> e));
System.out.println(result);
assertEquals(2.00, result.doubleValue(), 2);
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", Double.MAX_VALUE, 1), new Fruit("Melon", -1, 3),
new Fruit("Fig", 3, 1));
Double fruitResult = fruitList.stream().collect(Collectors.averagingLong(e -> e.getType()));
System.out.println(fruitResult);
assertEquals(1.66, fruitResult.doubleValue(), 2);
}
@Test
public void averagingDouble() {
List<Double> list = Arrays.asList(1d, 2d, 3d);
Double result = list.stream().collect(Collectors.averagingDouble(e -> e));
System.out.println(result);
assertEquals(2.00, result.doubleValue(), 2);
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", Double.MAX_VALUE, 1), new Fruit("Melon", -1, 3),
new Fruit("Fig", 3, 1));
Double fruitResult = fruitList.stream().collect(Collectors.averagingDouble(e -> e.getQuantity()));
System.out.println(fruitResult);
assertEquals(5.992310449541053E307, fruitResult.doubleValue(), 2);
}
@Test
public void summarizingInt() {
List<Integer> list = Arrays.asList(1, 2, 3);
IntSummaryStatistics result = list.stream().collect(Collectors.summarizingInt(e -> e));
System.out.println(result);
assertEquals(2.00, result.getAverage(), 2);
assertEquals(6, result.getSum());
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", 1, 1), new Fruit("Melon", 2, 3),
new Fruit("Fig", 3, 1));
IntSummaryStatistics fruitResult = fruitList.stream()
.collect(Collectors.summarizingInt(e -> e.getName().length()));
System.out.println(fruitResult);
assertEquals(5.66, fruitResult.getAverage(), 2);
assertEquals(17, fruitResult.getSum());
}
@Test
public void summarizingLong() {
List<Long> list = Arrays.asList(1L, 2L, 3L);
LongSummaryStatistics result = list.stream().collect(Collectors.summarizingLong(e -> e));
System.out.println(result);
assertEquals(2.00, result.getAverage(), 2);
assertEquals(6, result.getSum());
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", 1, 1), new Fruit("Melon", 2, 3),
new Fruit("Fig", 3, 1));
LongSummaryStatistics fruitResult = fruitList.stream().collect(Collectors.summarizingLong(e -> e.getType()));
System.out.println(fruitResult);
assertEquals(1.66, fruitResult.getAverage(), 2);
assertEquals(5, fruitResult.getSum());
}
@Test
public void summarizingDouble() {
List<Double> list = Arrays.asList(1d, 2d, 3d);
DoubleSummaryStatistics result = list.stream().collect(Collectors.summarizingDouble(e -> e));
System.out.println(result);
assertEquals(2.00, result.getAverage(), 2);
assertEquals(6.00, result.getSum(), 2);
List<Fruit> fruitList = Arrays.asList(new Fruit("Blueberry", 1, 1), new Fruit("Melon", 2, 3),
new Fruit("Fig", 3, 1));
DoubleSummaryStatistics fruitResult = fruitList.stream()
.collect(Collectors.summarizingDouble(e -> e.getQuantity()));
System.out.println(fruitResult);
assertEquals(2.00d, fruitResult.getAverage(), 2);
assertEquals(6.00d, fruitResult.getSum(), 2);
}
}
心得分享
Java Collectors Class Example 提供了幾種 Collectors 常見方法的操作範例,Class Collectors 介紹常見的 averagingInt 、 summarizingLong 等操作範例。