利用Java流進行類的整型字段求和的例子

我有兩個測試類:


import java.util.Arrays;
import java.util.List;
import java.util.function.ToIntFunction;
import java.util.stream.IntStream;
import java.util.stream.Stream;

class Age{
	private int age;
	public Age(int age){
		this.age = age;
	}
	
	public int getAgeValue(){
		return this.age;
	}
}

@SuppressWarnings("unused")
class User{
	private int id;
	private String name;
	private Age age;
	
	public User(int id, String name, int age){
		this.id = id;
		this.name = name;
		this.age = new Age(age);
	}
	
	public Age getAge(){
		return this.age;
	}
	
	public int getAgeWrapper(){
		return this.age.getAgeValue();
	}
	
}

先構造一個集合Collections:

private static List<User> users = Arrays.asList( 
            new User(1, "張三", 1),  
            new User(2, "李四", 2),  
            new User(3,"王五", 3),  
            new User(4, "趙六", 4));

// 獲得一個並行流:

Stream userStream = users.parallelStream();

// 獲得一個映射函數,該函數配合stream使用,能把所有User實例的Age字段映射成IntStream

ToIntFunction mapper = User::getAgeWrapper;

IntStream intstream = userStream.mapToInt(mapper);

// 得到輸出:10

System.out.println("Total: " + intstream.sum());

如果重複調用sum:

System.out.println("Total2: " + intstream.sum());

會遇到錯誤消息:

Exception in thread “main” java.lang.IllegalStateException: stream has already been operated upon or closed
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)
at java.base/java.util.stream.IntPipeline.reduce(IntPipeline.java:491)
at java.base/java.util.stream.IntPipeline.sum(IntPipeline.java:449)
at java8.stream.SumTest.main(SumTest.java:68)

如果不想用stream自帶的sum方法,也可以手動用reduce計算:

int total = intstream.reduce(0, (x, y) -> x + y);

一樣能得到10的結果。

全部測試代碼:

package java8.stream;

import java.util.Arrays;
import java.util.List;
import java.util.function.ToIntFunction;
import java.util.stream.IntStream;
import java.util.stream.Stream;

class Age{
	private int age;
	public Age(int age){
		this.age = age;
	}
	
	public int getAgeValue(){
		return this.age;
	}
}

@SuppressWarnings("unused")
class User{
	private int id;
	private String name;
	private Age age;
	
	public User(int id, String name, int age){
		this.id = id;
		this.name = name;
		this.age = new Age(age);
	}
	
	public Age getAge(){
		return this.age;
	}
	
	public int getAgeWrapper(){
		return this.age.getAgeValue();
	}
	
}
public class SumTest {

	private static List<User> users = Arrays.asList( 
            new User(1, "張三", 1),  
            new User(2, "李四", 2),  
            new User(3,"王五", 3),  
            new User(4, "趙六", 4));
	
	public static String covert2SnakeCase(final String camelCase)
	{
		final String regex = "([a-z])([A-Z])";
		final String replacement = "$1_$2";
		return camelCase.replaceAll(regex, replacement).toLowerCase();
	}
	
	public static void main(String[] args) {
		//double sum = users.parallelStream().mapToInt(User::getAge).getAgeValue().reduce(0, (x, y) -> x + y); 
		double sum2 = users.parallelStream().mapToInt(User::getAgeWrapper).sum(); 
		double sum = 0;
		
		Stream<User> userStream = users.parallelStream();
		
		ToIntFunction<User> mapper = User::getAgeWrapper;
		
		IntStream intstream = userStream.mapToInt(mapper);
		
		int total = intstream.reduce(0, (x, y) -> x + y);
		System.out.println("sum: " + total);
		// System.out.println("Total: " + intstream.sum());
		//System.out.println("Total2: " + intstream.sum());
		System.out.println("sum1: " + sum);
		//System.out.println(" sum2: " + sum2);
		System.out.println(covert2SnakeCase("helloJerry"));
		System.out.println(covert2SnakeCase("CongratulationsJerry"));
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章