【Java 8 新特性】Array, Map和List集合通过reduce()和collect()方法获取总数

文章目录

  • 1.使用`IntStream.sum()`求和
  • 2.在`Stream.collect()`中使用`Collectors.summingInt()`求和
  • 3.在`Stream.collect()`和`IntSummaryStatistics`中使用`Collectors.summarizingInt()`求和
  • 4.在`BiFunction`和`BinaryOperator`使用`Stream.reduce()`求和
  • 5.在自定义方法中使用`Stream.reduce()`求和
  • 6.`Array`获取总数的示例
  • 7.`List`获取总数的示例
  • 8.`List`中嵌套`Array`获取总数的示例
  • 9.`Map`获取总数的示例
  • 参考文献

在本页中,我们将使用 reduce()collect()方法提供 Java8 Array, MapList集合值的总和示例。

Java8中,有多种计算值总和的方法。我们可以利用IntStream.sum()从汇总统计中得到总数。

我们也可以创建自己的方法来求和。

我们将在这里讨论计算总和的不同方法。

1.使用IntStream.sum()求和

对于integer数据类型,我们可以用IntStream.sum()求和。

int sum = map.values().stream().mapToInt(i->i).sum();
int sum = list.stream().map(Line::getLength).mapToInt(Integer::intValue).sum();

Java8中,对于long数据类型,有LongStream;对于double数据类型,有DoubleStream

2.在Stream.collect()中使用Collectors.summingInt()求和

我们可以在Stream.collect()中使用Collectors.summingInt()integer数据类型获取总数

int sum = list.stream().map(Line::getLength).collect(Collectors.summingInt(i->i));

Java8中,对于long数据类型,有summingLong;对于double数据类型,有summingDouble

3.在Stream.collect()IntSummaryStatistics中使用Collectors.summarizingInt()求和

Stream.collect()IntSummaryStatistics中使用Collectors.summarizingInt()获得总数

IntSummaryStatistics stats = list.stream()
    			     .collect(Collectors.summarizingInt(Line::getLength));
IntSummaryStatistics stats = list.stream().flatMap(a->Arrays.stream(a))
			         .collect(Collectors.summarizingInt(i->i));
System.out.println(stats.getSum()); 

Java8中,对于long数据类型,我们在LongSummaryStatistics使用summingLong;对于double数据类型,我们在DoubleSummaryStatistics使用summingDouble

Line是我们自定义的类

Line.java

package com.concretepage;
public class Line {
     
	private int length;
	public Line(int length) {
     
		this.length = length;
	}
        public int getLength() {
     
		return length;
	}
} 

4.在BiFunctionBinaryOperator使用Stream.reduce()求和

我们可以用Stream.reduce()在并行处理中,BiFunction作为累加器(accumulator),BinaryOperator作为组合器(combiner)。

int sum = list.parallelStream().reduce(0, (output, ob) -> output + ob.getLength(), (a, b) -> a + b); 

这里0是一个标识(identity)。对流的每个元素使用BinaryOperator来操作标识。如果标识(identity)为0,那么在我们的示例中,它将获得stream元素的和。

5.在自定义方法中使用Stream.reduce()求和

要执行加法,我们还可以使用自定义方法Stream.reduce()如下。

int sum = Arrays.stream(array).reduce(0, StatisticsUtility::addIntData); 

这里StatisticsUtility是我们的自定义类

StatisticsUtility.java

package com.concretepage;
public class StatisticsUtility {
     
	public static int addIntData(int num1, int num2) {
     
		return num1 + num2;
	}
} 

我们也可以使用内置类进行求和。

int sum = Arrays.stream(array).reduce(0, Integer::sum); 

6.Array获取总数的示例

SumOfArrayDemo.java

package com.concretepage;
import java.util.Arrays;
import java.util.function.IntBinaryOperator;
public class SumOfArrayDemo {
     
    public static void main(String[] args) {
     
    	  int[] array = {
     23,43,56,97,32};
    	  System.out.println("--Using IntStream.sum()--");
    	  int sum = Arrays.stream(array).sum();
    	  System.out.println(sum);
    	  System.out.println("--Using Stream.reduce() with IntBinaryOperator--");    	  
    	  IntBinaryOperator ibop = (x,y) -> x+y;
    	  sum = Arrays.stream(array).reduce(0, ibop);
    	  System.out.println(sum);
    	  System.out.println("--Using Stream.reduce() with Integer.sum()--");
    	  sum = Arrays.stream(array).reduce(0, Integer::sum);
    	  System.out.println(sum);
    	  System.out.println("--Using custom method--");    	  
    	  sum = Arrays.stream(array).reduce(0, StatisticsUtility::addIntData);
    	  System.out.println(sum);
     }
} 

输出

--Using IntStream.sum()--
251
--Using Stream.reduce() with IntBinaryOperator--
251
--Using Stream.reduce() with Integer.sum()--
251
--Using custom method--
251 

7.List获取总数的示例

SumOfListDemo.java

package com.concretepage;
import java.util.ArrayList;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;
public class SumOfListDemo {
     
    public static void main(String[] args) {
     
      	  List<Line> list = new ArrayList<>();
      	  list.add(new Line(213));
      	  list.add(new Line(233));
          list.add(new Line(243));
      	  list.add(new Line(253));    	  
    	  System.out.println("--Using IntStream.sum()--");
    	  int sum = list.stream().map(Line::getLength).mapToInt(Integer::intValue).sum();
    	  System.out.println(sum);
    	  System.out.println("--Using Collectors.summingInt()--");    	  
    	  sum = list.stream().map(Line::getLength).collect(Collectors.summingInt(i->i));
    	  System.out.println(sum);    	  
    	  System.out.println("--Using summarizingInt()--");  
    	  IntSummaryStatistics stats = list.stream()
    			     .collect(Collectors.summarizingInt(Line::getLength));
    	  System.out.println(stats.getSum());
    	  System.out.println("--Using Stream.reduce() with combiner--"); 
    	  sum = list.parallelStream().reduce(0, (output, ob) -> output + ob.getLength(), (a, b) -> a + b);
    	  System.out.println(sum);
     }
}  

输出

--Using IntStream.sum()--
942
--Using Collectors.summingInt()--
942
--Using summarizingInt()--
942
--Using Stream.reduce() with combiner--
942 

8.List中嵌套Array获取总数的示例

SumOfListOfArrayDemo.java

package com.concretepage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;
public class SumOfListOfArrayDemo {
     
	public static void main(String[] args) {
     
		List<Integer[]> list = new ArrayList<>();
		Integer[] a1 = {
     6,3,8,12};
		list.add(a1);
		Integer[] a2 = {
     8,13,9,22};
		list.add(a2);
  	        System.out.println("--Using Collectors.summingInt()--");		
		int sum = list.stream().flatMap(a->Arrays.stream(a)).
				           collect(Collectors.summingInt(i->i));
		System.out.println(sum);
  	        System.out.println("--Using Collectors.summarizingInt()--");			
  	        IntSummaryStatistics stats = list.stream().flatMap(a->Arrays.stream(a))
			     .collect(Collectors.summarizingInt(i->i));
  	        System.out.println(stats.getSum());
  	        System.out.println("--Using IntStream.sum()--");		
	        sum = list.stream().flatMap(a->Arrays.stream(a)).
	    		           mapToInt(Integer::intValue).sum();
		System.out.println(sum);	
	}
} 

输出

--Using Collectors.summingInt()--
81
--Using Collectors.summarizingInt()--
81
--Using IntStream.sum()--
81 

9.Map获取总数的示例

SumOfMapValues.java

package com.concretepage;
import java.util.HashMap;
import java.util.IntSummaryStatistics;
import java.util.Map;
import java.util.stream.Collectors;
public class SumOfMapValues {
     
	public static void main(String[] args) {
     
	  Map<Integer, Integer> map = new HashMap<>();
	  map.put(1, 12);
	  map.put(2, 24);
	  map.put(3, 10);
	  System.out.println("--Using IntStream.sum()--");
  	  int sum = map.values().stream().mapToInt(i->i).sum();
  	  System.out.println(sum);
	  System.out.println("--Using BinaryOperator--");  	  
  	  sum = map.values().stream().reduce(0, Integer::sum);
  	  System.out.println(sum); 
	  System.out.println("--Using Collectors.summingInt()--");    	  
  	  sum = map.values().stream().collect(Collectors.summingInt(i->i));
  	  System.out.println(sum);
	  System.out.println("--Using Collectors.summarizingInt()--");    	  	  
          IntSummaryStatistics stats = map.values().stream().collect(Collectors.summarizingInt(i->i));
          System.out.println(stats.getSum());
	  System.out.println("--Using custom method--");         
	  sum = map.values().stream().reduce(0, StatisticsUtility::addIntData);
	  System.out.println(sum);
	}
} 

输出

--Using IntStream.sum()--
46
--Using BinaryOperator--
46
--Using Collectors.summingInt()--
46
--Using Collectors.summarizingInt()--
46
--Using custom method--
46 

参考文献

【1】Java 8 Sum: Array, Map and List Collection Example using reduce() and collect() Method

你可能感兴趣的:(Java编程,#,Java,8,java,stream,reduce,collect,array)