JDK 8新特性全收錄——下

七、方法引用和構造函數引用

格式: 容器(對象實例/類):: 方法名

 List<VideoOrder> list2 = Arrays.asList(new VideoOrder("2019110601",21,"springcloud教程"),
                new VideoOrder("2019110602",23,"netty 教程"),
                new VideoOrder("2019110603",21,"sql教程"));
        list1.stream().map(VideoOrder::getMoney);

八、集合框架

1、stream流

      Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注於對集合對象進行各種非常便利、高效的聚合操作(aggregate operation),或者大批量數據操作 (bulk data operation)。Stream API 藉助於同樣新出現的 Lambda 表達式,極大的提高編程效率和程序可讀性。

集合有兩種方式生成流:
  • stream() − 爲集合創建串行流。
  • parallelStream() − 爲集合創建並行流。

    parallelStream並行流 使用以及注意點

    1、並非使用並行流 處理速度就會快 看數據量大小 一般數據量小於1萬條不建議開啓並行流

    2、並行流線程並不安全需要使用 線程安全的集合進行處理
Strram的方法。

中間操作(intermediate)主要有以下方法(此類型的方法返回的都是Stream對象):

map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

終端操作(terminal)主要有以下方法:

forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

集合框架

1、map 函數 類型轉換

List<VideoOrder> list1 = Arrays.asList(new VideoOrder("2019110601",21,"springboot教程"),
        new VideoOrder("2019110602",23,"redis 教程"),
        new VideoOrder("2019110603",21,"sql教程"));

 List<Integer> list = list1.stream().map(VideoOrder::getMoney).collect(Collectors.toList());

源碼:

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

作用:不讓外部看到實際的實體屬性 進行實體轉換 公司常用

2、filter 函數 元素過濾

List<String> list = Arrays.asList("aaa","bbb","ccc");
List<String> lists = list.stream()
                     .filter(x ->x.startsWith("a"))
                     .collect(Collectors.toList());

源碼:

Stream<T> filter(Predicate<? super T> predicate);

3、limit 函數

List<String> list = Arrays.asList("aaa","bbb","ccc");
list.stream().limit(1).collect(Collectors.toList());

源碼:

@Override
public final Stream<P_OUT> limit(long maxSize) {
    if (maxSize < 0)
        throw new IllegalArgumentException(Long.toString(maxSize));
    return SliceOps.makeRef(this, 0, maxSize);
}

4、sorted 函數 默認 升序排序

List<VideoOrder> list1 = Arrays.asList(new VideoOrder("2019110601",21,"springboot教程"),
        new VideoOrder("2019110602",23,"redis 教程"),
        new VideoOrder("2019110603",21,"sql教程"));

 List<Integer> list = list1.stream().map(VideoOrder::getMoney).collect(Collectors.toList());
 list.stream().sorted(Integer::compareTo);

源碼:

@Override
public final Stream<P_OUT> sorted() {
    return SortedOps.makeRef(this);
}

5、max函數

List<String> list = Arrays.asList("x","aaaa","bbb");
 String maxlenth = list.stream().max(Comparator.comparing(String::length)).orElse("");

源碼:

@Override
public final Optional<P_OUT> max(Comparator<? super P_OUT> comparator) {
    return reduce(BinaryOperator.maxBy(comparator));
}

6、min函數

List<String> list = Arrays.asList("x","aaaa","bbb");
 String minlenth = list.stream().min(Comparator.comparing(String::length)).orElse("");

源碼:

@Override
public final Optional<P_OUT> min(Comparator<? super P_OUT> comparator) {
    return reduce(BinaryOperator.minBy(comparator));

}

7、foreach 函數

List<String> list = Arrays.asList("x","aaaa","bbb");
list.forEach(x->System.out::println(x););

注:遍歷無法對外部變量進行修改

收集器和集合統計

1、reduce函數 聚合方法

List<VideoOrder> list1 = Arrays.asList(new VideoOrder("2019110601",21,"springboot教程"),
        new VideoOrder("2019110602",23,"redis 教程"),
        new VideoOrder("2019110603",21,"sql教程"));

 final Integer integer = list1.stream().map(VideoOrder::getMoney).collect(Collectors.reducing((x, y) -> x + y)).get();

源碼:

public static <T> Collector<T, ?, Optional<T>>
reducing(BinaryOperator<T> op) {
    class OptionalBox implements Consumer<T> {
        T value = null;
        boolean present = false;

        @Override
        public void accept(T t) {
            if (present) {
                value = op.apply(value, t);
            }
            else {
                value = t;
                present = true;
            }
        }
    }
2、collection 收集方法
List<VideoOrder> list1 = Arrays.asList(new VideoOrder("2019110601",21,"springboot教程"),
        new VideoOrder("2019110602",23,"redis 教程"),
        new VideoOrder("2019110603",21,"sql教程"));

 list1.stream().collect(Collectors.toSet()); //轉set
 list1.stream().collect(Collectors.toCollection(TreeSet::new));

//轉自定義集合

3、joining 函數 拼接方法

List<VideoOrder> list1 = Arrays.asList(new VideoOrder("2019110601",21,"springboot教程"),
        new VideoOrder("2019110602",23,"redis 教程"),
        new VideoOrder("2019110603",21,"sql教程"));

 list1.stream().map(VideoOrder::getTitle).collect(Collectors.joining()); //字符串拼接
 list1.stream().map(VideoOrder::getTitle).collect(Collectors.joining("-")); //使用"-"拼接
 list1.stream().map(VideoOrder::getTitle).collect(Collectors.joining("-","[","]")); //加上"[]"在用"-拼接"

源碼:


無參:
 public static Collector<CharSequence, ?, String> joining() {
    return new CollectorImpl<CharSequence, StringBuilder, String>(
            StringBuilder::new, StringBuilder::append,
            (r1, r2) -> { r1.append(r2); return r1; },
            StringBuilder::toString, CH_NOID);
}

 帶一個:
   public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) {
    return joining(delimiter, "", "");
}

帶三個:
   public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
                                                         CharSequence prefix,
                                                         CharSequence suffix) {
    return new CollectorImpl<>(
            () -> new StringJoiner(delimiter, prefix, suffix),
            StringJoiner::add, StringJoiner::merge,
            StringJoiner::toString, CH_NOID);
}

4、partitioningBy 函數

Map<Boolean,List<Integer>> result   =  Stream.of(1,2,3)
                         .collect(Collectors.partitioningBy(obj ->obj.intValue()>2));
        結果:{false=[1, 2], true=[3]}

源碼:

public static <T>
Collector<T, ?, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate) {
    return partitioningBy(predicate, toList());
}

5、groupingBy 分組函數

List<Student> list = Arrays.asList(new Student("北京","22"),
             new Student("南京","23"),new Student("上海","20"),new Student("北京","21"));
 根據省份分組 :    Map<String,List<Student> students> map  =   list.stream().collect(Collectors.groupingBy(x ->x.getProvince()));

源碼:
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier) {
    return groupingBy(classifier, toList());
}

6、counting 分組進階 統計

List<Student> list = Arrays.asList(new Student("北京","22"),
                new Student("南京","23"),new Student("上海","20"),new Student("北京","21"));
Map<String,Long> map = list.stream()
            .collect(Collectors.groupingBy(obj->obj.getProvince(),Collectors.counting()));
結果: {上海=1, 南京=1, 北京=2}

源碼:

public static <T> Collector<T, ?, Long>
counting() {
    return reducing(0L, e -> 1L, Long::sum);
}

7、summarizing 統計函數

7.1summarizingInt

List<Student> list = Arrays.asList(new Student("北京",22),
                new Student("南京",23),new Student("上海",21),new Student("北京",24));
        IntSummaryStatistics statistics = list.stream()
                                                 .collect(Collectors.summarizingInt(Student::getAge));
        System.out.println("最大值"+statistics.getMax());
        System.out.println("最小值"+statistics.getMin());
        System.out.println("平均值"+statistics.getAverage());
        System.out.println("總和"+statistics.getSum());
        System.out.println("總數"+statistics.getCount());


    7.2、summarizingDouble
    7.3、summarizingLong

summingInt int類型數據求和

List<VideoOrder> list1 = Arrays.asList(new VideoOrder("2019110601",21,"springboot教程"),
        new VideoOrder("2019110602",23,"redis 教程"),
        new VideoOrder("2019110603",21,"sql教程"));
final Integer collect2 = list1.stream().collect(Collectors.summingInt(VideoOrder::getMoney));

8、averagingInt函數求平均

final Double collect2 = list1.stream().collect(Collectors.averagingInt(VideoOrder::getMoney));

思維練習:

pojo:

@Data
public class VideoOrder {

 private String tradeNo;
 private Integer money;
 private String title;
}

1、交集 注:需要重寫下equals、hash方法

數據:
總金額 65
List<VideoOrder> list1 = Arrays.asList(new VideoOrder("2019110601",21,"springboot教程"),
        new VideoOrder("2019110602",23,"redis 教程"),
        new VideoOrder("2019110603",21,"sql教程"));
總金額 64
 List<VideoOrder> list2 = Arrays.asList(new VideoOrder("2019110601",21,"springcloud教程"),
         new VideoOrder("2019110602",22,"netty 教程"),
         new VideoOrder("2019110603",21,"sql教程"));

實現:


 Stream<VideoOrder> orderStream = list1.stream().filter(list2::contains);
 
 @Override
public int hashCode() {
    return title.hashCode();
}

@Override
public boolean equals(Object obj) {
    if(obj instanceof VideoOrder){
       return ((VideoOrder) obj).title.equals(this.title);
    }
    return super.equals(obj);
}

2、差集

List<VideoOrder> orders = list1.stream()
      .filter(obj -> !list2.contains(obj)).collect(Collectors.toList());

3、去重並集

List<VideoOrder> collect = list1.parallelStream().collect(Collectors.toList());
collect.addAll(list2);
List<VideoOrder> distinct = collect.parallelStream().distinct().collect(Collectors.toList());

3.1 並集

//並集
List<VideoOrder> collect = list1.parallelStream().collect(Collectors.toList());
collect.addAll(list2);

4、求平均

1、Double aDouble = list1.stream().collect(Collectors.averagingInt(VideoOrder::getMoney));
2、final IntSummaryStatistics collect1 = list1.stream().collect(Collectors.summarizingInt(VideoOrder::getMoney));
     final double average = collect1.getAverage();

5、求和

1、 final IntSummaryStatistics collect1 = list1.stream().collect(Collectors.summarizingInt(VideoOrder::getMoney));
    collect1.getSum();
2、final Integer collect2 = list1.stream().collect(Collectors.summingInt(VideoOrder::getMoney));

jdk 8新特性全收錄 ——上鍊接地址:https://blog.csdn.net/weixin_42083036/article/details/102951697

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