關於stream使用的好文推薦:
這里去看了ibm的一篇關於stream的文章,get到了不少stream還沒遇到過的用法。老鐵們可以去學習一下。[https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/ ]
public class Test { public static void main(String[] args) { List<Student> list1 = Arrays.asList( new Student(1, "t1", 1, BigDecimal.valueOf(1.5), 10d, "1"), new Student(2, "t2", 2, BigDecimal.valueOf(2.5), 20d, "2"), new Student(3, "t3", 2, BigDecimal.valueOf(3.5), 30d, "2")); //★★★★ 注意此寫法: .reduce((sum1, i) -> sum1 + i) // 新方法:可以用內建方法,也可以自己定義 //Map和Reduce操作是函數式編程的核心操作,因為其功能,reduce 又被稱為折疊操作。 //SQL中類似 sum()、avg() 或者 count() 的聚集函數,實際上就是 reduce 操作,因為它們接收多個值並返回一個值。 //流API定義的 reduceh() 函數可以接受lambda表達式,並對所有值進行合並。 // IntStream這樣的類有類似 average()、count()、sum() 的內建方法來做 reduce 操作,也有mapToLong()、mapToDouble() 方法來做轉換。 double bill = list1.stream() .map((i) -> i.price2 + 0.12 * i.price2) .reduce((sum1, i) -> sum1 + i) .get(); // 為每個price2加上12%的稅 //mapToInt int sum1 = list1.stream() .mapToInt(p -> p.unit) .sum(); System.out.println("--00->" + sum1); //mapToInt - nax 獲取分享數 Integer shareTatol = list1 .stream() .mapToInt(Student::getId) .max() .orElse(0); System.out.println("--01->" + shareTatol); //null到時候,給默認值0.0 Double reduce = list1.stream() .reduce(0.0, (x, y) -> x + (y.getPrice2() * y.getUnit()), Double::sum); System.out.println("--02->" + reduce); // Integer integer = list1.stream() .map(Student::getUnit) .max((x, y) -> Float.compare(x, y)) .get(); System.out.println("--03->" + integer); //從小到大分數排序: list1.stream() .map(Student::getUnit).sorted((x, y) -> Float.compare(x, y)); double average = list1.stream() .map(Student::getPrice2).reduce(0.0, Double::sum) / list1.size(); long count1 = list1.stream() .map(Student::getUnit).filter(r -> r > average).count(); System.out.println("--035-高於平均值的有多少個:-->" + count1); //最大值,最小值,平均值 // 為啥返回Optional? 如果stream為null怎么辦, 這時候Optinal就很有意義了 Optional<Student> mostCalorieDish = list1.stream().max(Comparator.comparingInt(Student::getUnit)); Optional<Student> minCalorieDish = list1.stream().min(Comparator.comparingInt(Student::getUnit)); Double avgCalories = list1.stream().collect(Collectors.averagingInt(Student::getUnit)); System.out.println("--04->" + mostCalorieDish); System.out.println("--05->" + minCalorieDish); System.out.println("--06->" + avgCalories); // Collectors.maxBy 和 Collectors.minBy 來計算流中的最大或最小值。 Optional<Student> maxDish = list1.stream().collect(Collectors.maxBy(Comparator.comparing(Student::getUnit))); Optional<Student> minDish = list1.stream().collect(Collectors.minBy(Comparator.comparing(Student::getUnit))); System.out.println("--07->" + maxDish); System.out.println("--08->" + minDish); //BigDecimal::add方法1: BigDecimal amounts = list1.stream() .map(item -> item.price) .reduce(BigDecimal.ZERO, BigDecimal::add); amounts = amounts.setScale(1, BigDecimal.ROUND_UP); System.out.println("--09->" + amounts); BigDecimal amounts21 = list1.stream() .map(item -> item.price.multiply(BigDecimal.valueOf(item.unit))) .reduce(BigDecimal.ZERO, BigDecimal::add); amounts21 = amounts21.setScale(1, BigDecimal.ROUND_UP); System.out.println("--091->" + amounts21); //BigDecimal::add方法2: BigDecimal sum2 = list1.stream() .map(Student::getPrice) .reduce(BigDecimal::add) .get(); sum2 = sum2.setScale(1, BigDecimal.ROUND_UP); System.out.println("--10->" + sum2); BigDecimal sum21 = list1.stream() .map(item -> item.price.multiply(BigDecimal.valueOf(item.unit))) .reduce(BigDecimal::add) .get(); sum21 = sum21.setScale(1, BigDecimal.ROUND_UP); System.out.println("--101->" + sum21); list1.stream().mapToDouble(Student::getUnit).sum();//和 list1.stream().mapToDouble(Student::getUnit).max();//最大 list1.stream().mapToDouble(Student::getUnit).min();//最小 list1.stream().mapToDouble(Student::getUnit).average();//平均值 // intStream、LongStream 和 DoubleStream 等流的類中,有個非常有用的方法叫做 summaryStatistics() 。 // 可以返回 IntSummaryStatistics、LongSummaryStatistics 或者 DoubleSummaryStatistic s,描述流中元素的各種摘要數據。 //獲取數字的個數、最小值、最大值、總和以及平均值 https://www.cnblogs.com/L-a-u-r-a/p/9077615.html // IntSummaryStatistics summaryStatistics = list1.stream().mapToInt((x) -> x.getUnit()).summaryStatistics(); IntSummaryStatistics summaryStatistics = list1.stream().collect(Collectors.summarizingInt(Student::getUnit)); double average = summaryStatistics.getAverage(); long count = summaryStatistics.getCount(); int max = summaryStatistics.getMax(); int min = summaryStatistics.getMin(); long sum = summaryStatistics.getSum(); System.out.println("count : " + count); System.out.println("max : " + max); System.out.println("min : " + min); System.out.println("Sum : " + sum); System.out.println("Average : " + average); } @Builder @Data @EqualsAndHashCode(callSuper = false) static class Student { int id; String name; Integer unit; BigDecimal price; double price2; String groupId; } }
https://www.cnblogs.com/yangweiqiang/p/6934671.html
