Java Collectors Class - Java 147

Java Collectors Class – Java 147

Java 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 等操作範例。

發佈留言