首页 > 编程语言 >Java 8 新特性

Java 8 新特性

时间:2024-03-11 17:35:10浏览次数:36  
标签:Java Collectors stream 特性 collect add strList String

Java 8

  • Java 8 允许您通过::关键字传递方法或构造函数的引用。

Lambda 表达式

List<String> names = Arrays.asList("banana", "apple", "orange","fruit","grape");
// 老版本Java排列字符串
Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return a.compareTo(b);
    }
});

// Java 8 匿名函数的方式
Collections.sort(names, (String a, String b) -> {
    return a.compareTo(b);
});
// 以上可以简写为如下
Collections.sort(names, (String a, String b) -> a.compareTo(b));
// List的sort方法
names.sort((a, b) -> a.compareTo(b));

函数式接口(Functional Interfaces)

  • 只包含一个抽象的方法,但可以有多个非抽象方法的接口,可以隐式转换为lambda表达式,一般以@FunctionalInterface进行标记,如下两个例子。

    • java.lang.Runnable
    • java.util.concurrent.Callable
  • 内置的函数式接口

    • Predicate 接口是只有一个参数的返回布尔类型值的 断言型 接口。

    • Function接口接受一个参数并生成结果。

    • Supplier接口产生给定泛型类型的结果。

    • Consumer 接口表示要对单个输入参数执行的操作。

    • Comparator是老 Java 中的经典接口, Java 8 在此之上添加了多种默认方法。

Optional

// 获取值,没有时返回默认值
Optional.ofNullable(u).map(user->user.name).orElse("Unknown");

// 多层取值,没有时异常提示
Optional.ofNullable(comp).map(Competition::getResult).map(User::getName).orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));

// 过滤,获取不到时异常提示
Optional.ofNullable(name).filter(User::isNameValid).orElseThrow(()->new IllegalArgumentException("Invalid username"));

Streams

List<String> strList = new ArrayList<>();
strList.add("one");
strList.add("two");
strList.add("three");
strList.add("four");
strList.add("five");
strList.add("six");
strList.add("seven");
strList.add("eight");

Filter(过滤)

strList = strList.stream().filter(i->"one".equals(i)).collect(Collectors.toList());

Sorted(排序)

strList = strList.stream().filter(i->"one".equals(i))
                .sorted(Comparator.comparing(Function.identity()))
                .collect(Collectors.toList());

Map(转换对象)

// map
strList = strList.stream().filter(i->"one".equals(i))
                .map(String::toUpperCase).filter(Objects::nonNull).distinct()
                .sorted(Comparator.comparing(Function.identity()))
			    .collect(Collectors.toList());

// flatMap 
List<String> strList = new ArrayList<>();
strList.add("one");
strList.add("two");

List<String> strList2 = new ArrayList<>();
strList2.add("five");
strList2.add("six");

List<List<String>> list = new ArrayList<>();
list.add(strList);
list.add(strList2);

List<String> allList = list.stream().flatMap(Collection::stream).collect(Collectors.toList());

// Collectors.toMap
Map<String, String> greenPayMap = poList.stream().collect(Collectors.toMap(OrderPO::getPid, OrderPO::getGreenPay, (o, n) -> o));
// (o, n) -> o) 处理重复的`Key`,避免当出现相同 `Key`值时会抛出 `IllegalStateException` 异常。

// Collectors.groupingBy
Map<String, List<OrderDetailPO>> detailMap = detailList.stream().collect(Collectors.groupingBy(OrderDetailPO::getPid));

Match(匹配)

// 是否全匹配
strList.stream().allMatch(i->i.startsWith("o"));
// 是否有一个匹配
strList.stream().anyMatch(i->i.startsWith("o"));
// 是否全部不匹配
strList.stream().noneMatch(i->i.startsWith("o"));

Count(计数)

strList.stream().filter(i->"one".equals(i)).count();

Reduce(规约)

// 字符串连接,concat = "ABCD"
String concat = Stream.of("A", "B", "C", "D").reduce("", String::concat);
// 求最小值,minValue = -3.0
double minValue = Stream.of(-1.5, 1.0, -3.0, -2.0).reduce(Double.MAX_VALUE, Double::min);
// 求和,sumValue = 10, 有起始值
int sumValue = Stream.of(1, 2, 3, 4).reduce(0, Integer::sum);
// 求和,sumValue = 10, 无起始值
sumValue = Stream.of(1, 2, 3, 4).reduce(Integer::sum).get();

Collectors

// 1、分组
Map<String, List<User>> cityMap = users.stream().collect(Collectors.groupingBy(User::getCity));

// 2、分组并计数
Map<String, Long> countByCity = users.stream().collect(Collectors.groupingBy(User::getCity, Collectors.counting()));

// 3、分组并求平均值
Map<String, Double> i = users.stream().collect(Collectors.groupingBy(User::getCity, Collectors.averagingInt(User::getScore)));  

// 4、拼接
String str = Stream.of("A", "B", "C", "D").collect(Collectors.joining());

// 5、Collectors.mapping
List<String> names = people.stream().collect(Collectors.mapping(Person::getName, Collectors.toList()));  

// 6、Collectors.groupingBy + Collectors.mapping
Map<String, List<ReportItemTypeInfo>> mapLabClassList = labClassVOList.stream()
                .filter(i -> StringUtils.isNotBlank(i.getLabItemType()))
                .collect(Collectors.groupingBy(LabClassVO::getLabItemType, Collectors.mapping(j -> new ReportItemTypeInfo(j.getLabId(), j.getLabName()), Collectors.toList())));

标签:Java,Collectors,stream,特性,collect,add,strList,String
From: https://www.cnblogs.com/soul-Q/p/18066636

相关文章

  • 一文学会JDBC实现java和mySQL的数据连接(尚硅谷学习课程代码+笔记+思路总结)
    JDBC是指数据库连接技术,用于java连接mySQL等数据库。本文详细介绍了尚硅谷课程中JDBC的学习内容和补充知识。概述java语言只提供规范接口,存在于java.sql.javax.sql包下,然后数据库软件根据java提供的规范实现具体的驱动代码(jar)jar包是java程序打成的一种压缩包格式,只要导入就......
  • Java多线程基础用法
    线程创建线程创建的三种方式:Thread(继承Thread类)自定义线程类继承Thread类重写run()方法。编写线程执行体创建线程对象,调用start()方法启动线程packagecom.lily.demo01;publicclassTestThreadextendsThread{@Overridepublicvoidrun(){for......
  • Java登陆第三十四天——使用Vite创建工程化的Vue3项目
    VueVue是基于标准HTML、CSS和JavaScript构建的前端框架,可以更高效地开发前端页面。ViteVite是Vue团队开发的项目管理工具。Maven的主要功能引入依赖项目管理使用Maven可以工程化的管理后端代码。npm的主要功能:引入依赖vite的主要功能:项目管理使用npm+vit......
  • 一次解决Docker内java变量原因导致执行Kafka查询消费报错经历
    引言企业内对某设备小集群进行状态巡检(包括内存、磁盘、CPU、集群状态、集群Docker内接口状态、服务状态、Kafka消费情况监控)。由于需要将状态的结果通过命令展示在命令行中,且查询命令较多,于是打算脚本解决。在写脚本时,查询内容包括了宿主机和docker内的服务都需......
  • Java 遍历文件夹内每个文件夹的文件
    在Java中,你可以使用java.nio.file包中的Files和DirectoryStream类来遍历文件夹内的所有文件,包括子文件夹中的文件。以下是一个示例代码,展示了如何实现这个功能:importjava.nio.file.DirectoryStream;importjava.nio.file.Files;importjava.nio.file.Path;importjava.nio.f......
  • JavaScript逆向之有道翻译加解密全过程解析
    本篇文章用于解析有道翻译中的加解密全过程url:https://fanyi.youdao.com/index.html#/加密访问网址,输入框中随便输入一个英文单词,查看触发流量包,只看Fetch/XHR类型的。这里主要关注webtranslate的这条,请求参数和响应数据都是有加密的,主要了解其的加解密逻辑。根据url定位......
  • Java诊断工具Arthas:开篇之watch实战
    Arthas是阿里开源的线上监控诊断产品,用于问题的排查和诊断。它的出现大大提高线上排查问题的效率,这篇只讲它一个非常牛逼的功能,其它功能往后篇章会在展开详细说。一、Arthas能为你做什么?1、遇到问题无法在线上debug,难道只能通过加日志再重新发布吗?2、我改的代码为什么没有执......
  • Java基础输入输出
    好久不写普通Java,一上手发现简单的部分都忘记怎么写了……趁着这次练习,赶紧记一下packageorg.example;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){//System.out.println("Helloworld!");Scannerscanner=ne......
  • ubuntu20.04-通过docker安装jenkins并自动化发布java
    前言jenkins需要git、maven和node,其中maven和node手动添加,git和git环境是jenkins镜像自带了的。如果删除了docker对应的jenkins容器后(删除前一定备份jenkins_home整个文件夹,否则怕前功尽弃:tar-czvfjenkins_home.tar.gz/var/jenkins_home)如果删除了容器,需要重新安装并配置m......
  • java: 程序包com.sun.org.slf4j.internal不存在
    java:程序包com.sun.org.slf4j.internal不存在事件之由来问题之分析处理之方案收工事件之由来拉完别人的项目后,启动不了了,报错提示:java:程序包com.sun.org.slf4j.internal不存在1问题之分析就是别人用lombok了同时使用slf4j和lombok的时候会出现这个问题原因是slf4j和lombok自......