七、方法引用和構造函數引用
格式: 容器(對象實例/類):: 方法名
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