当前位置: 首页 > news >正文

Java8 新特性

Java8 新特性

1.Interface

新 interface 的方法可以用defaultstatic修饰,这样就可以有方法体,实现类也不必重写此方法

  1. default修饰的方法,是普通实例方法,可以用this调用,可以被子类继承、重写。
  2. static修饰的方法,使用上和一般类静态方法一样。但它不能被子类继承,只能用Interface调用
public interface InterfaceNew {static void sm() {System.out.println("interface提供的方式实现");}static void sm2() {System.out.println("interface提供的方式实现");}default void def() {System.out.println("interface default方法");}default void def2() {System.out.println("interface default2方法");}//须要实现类重写void f();
}public interface InterfaceNew1 {default void def() {System.out.println("InterfaceNew1 default方法");}
}//
public class InterfaceNewImpl implements InterfaceNew , InterfaceNew1{public static void main(String[] args) {InterfaceNewImpl interfaceNew = new InterfaceNewImpl();interfaceNew.def();}@Overridepublic void def() {InterfaceNew1.super.def();}@Overridepublic void f() {}
}







2.functional interface 函数式接口







3.Lambda 表达式

格式

(parameters) -> expression 或
(parameters) ->{ statements; }
3.1替代匿名内部类

1.Runnable 接口

2.Comparator 接口

3.Listener 接口

4.自定义接口

@FunctionalInterface
public interface LambdaInterface {void f();
}
//使用
public class LambdaClass {public static void forEg() {lambdaInterfaceDemo(()-> System.out.println("自定义函数式接口"));}//函数式接口参数static void lambdaInterfaceDemo(LambdaInterface i){i.f();}
}
3.2集合迭代
void lamndaFor() {List<String> strings = Arrays.asList("1", "2", "3");//传统foreachfor (String s : strings) {System.out.println(s);}//Lambda foreachstrings.forEach((s) -> System.out.println(s));//orstrings.forEach(System.out::println);//mapMap<Integer, String> map = new HashMap<>();map.forEach((k,v)->System.out.println(v));
}
3.3方法的引用
public class LambdaClassSuper {LambdaInterface sf(){return null;}
}public class LambdaClass extends LambdaClassSuper {public static LambdaInterface staticF() {return null;}public LambdaInterface f() {return null;}void show() {//1.调用静态函数,返回类型必须是functional-interfaceLambdaInterface t = LambdaClass::staticF;//2.实例方法调用LambdaClass lambdaClass = new LambdaClass();LambdaInterface lambdaInterface = lambdaClass::f;//3.超类上的方法调用LambdaInterface superf = super::sf;//4. 构造方法调用LambdaInterface tt = LambdaClassSuper::new;}
}
3.4访问变量
int i = 0;
Collections.sort(strings, (Integer o1, Integer o2) -> o1 - i);
//i =3;lambda 表达式可以引用外边变量,但是该变量默认拥有 final 属性







4.Stream

@Test
public void test() {List<String> strings = Arrays.asList("abc", "def", "gkh", "abc");//返回符合条件的streamStream<String> stringStream = strings.stream().filter(s -> "abc".equals(s));//计算流符合条件的流的数量long count = stringStream.count();//forEach遍历->打印元素strings.stream().forEach(System.out::println);//limit 获取到1个元素的streamStream<String> limit = strings.stream().limit(1);//toArray 比如我们想看这个limitStream里面是什么,比如转换成String[],比如循环String[] array = limit.toArray(String[]::new);//map 对每个元素进行操作返回新流Stream<String> map = strings.stream().map(s -> s + "22");//sorted 排序并打印strings.stream().sorted().forEach(System.out::println);//Collectors collect 把abc放入容器中List<String> collect = strings.stream().filter(string -> "abc".equals(string)).collect(Collectors.toList());//把list转为string,各元素用,号隔开String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));//对数组的统计,比如用List<Integer> number = Arrays.asList(1, 2, 5, 4);IntSummaryStatistics statistics = number.stream().mapToInt((x) -> x).summaryStatistics();System.out.println("列表中最大的数 : "+statistics.getMax());System.out.println("列表中最小的数 : "+statistics.getMin());System.out.println("平均数 : "+statistics.getAverage());System.out.println("所有数之和 : "+statistics.getSum());//concat 合并流List<String> strings2 = Arrays.asList("xyz", "jqx");Stream.concat(strings2.stream(),strings.stream()).count();//注意 一个Stream只能操作一次,不能断开,否则会报错。Stream stream = strings.stream();//第一次使用stream.limit(2);//第二次使用stream.forEach(System.out::println);//报错 java.lang.IllegalStateException: stream has already been operated upon or closed//但是可以这样, 连续使用stream.limit(2).forEach(System.out::println);
}







5.Optional

class Zoo {private Dog dog;
}class Dog {private int age;
}Zoo zoo = getZoo();
if(zoo != null){Dog dog = zoo.getDog();if(dog != null){int age = dog.getAge();System.out.println(age);}
}Optional.ofNullable(zoo).map(o -> o.getDog()).map(d -> d.getAge()).ifPresent(age ->System.out.println(age)
);







6.Date-Time API

LocalDateTime.class //日期+时间 format: yyyy-MM-ddTHH:mm:ss.SSS
LocalDate.class //日期 format: yyyy-MM-dd
LocalTime.class //时间 format: HH:mm:ss

Java 8 之前:

public void oldFormat(){Date now = new Date();//format yyyy-MM-ddSimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String date  = sdf.format(now);System.out.println(String.format("date format : %s", date));//format HH:mm:ssSimpleDateFormat sdft = new SimpleDateFormat("HH:mm:ss");String time = sdft.format(now);System.out.println(String.format("time format : %s", time));//format yyyy-MM-dd HH:mm:ssSimpleDateFormat sdfdt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String datetime = sdfdt.format(now);System.out.println(String.format("dateTime format : %s", datetime));
}

Java 8 之后:

public void newFormat(){//format yyyy-MM-ddLocalDate date = LocalDate.now();System.out.println(String.format("date format : %s", date));//format HH:mm:ssLocalTime time = LocalTime.now().withNano(0);System.out.println(String.format("time format : %s", time));//format yyyy-MM-dd HH:mm:ssLocalDateTime dateTime = LocalDateTime.now();DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String dateTimeStr = dateTime.format(dateTimeFormatter);System.out.println(String.format("dateTime format : %s", dateTimeStr));
}

Java 8 之前 转换都需要借助 SimpleDateFormat 类,而Java 8 之后只需要 LocalDateLocalTimeLocalDateTime

相关文章:

  • Java-并发编程--ThreadLocal、InheritableThreadLocal
  • 《LeetCode热题100》笔记题解思路技巧优化_Part_3
  • QT 状态机的使用
  • RocketMQ架构详解
  • 17个工作必备的Python自动化代码分享(上篇)
  • 泽众云真机-机型支持ADB调试功能即将上线
  • 进程学习--02
  • 有来团队后台项目-解析7
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)中篇
  • Postman请求API接口测试步骤和说明
  • C#使用SharpZipLib对文件进行压缩和解压
  • 【Linux】基础 IO(文件描述符)-- 详解
  • 爬蟲IP代理詳細指南
  • 【爬虫介绍】了解爬虫的魅力
  • 2024/3/14打卡棋子(14届蓝桥杯)——差分
  • [笔记] php常见简单功能及函数
  • 【知识碎片】第三方登录弹窗效果
  • Angular 2 DI - IoC DI - 1
  • Computed property XXX was assigned to but it has no setter
  • HomeBrew常规使用教程
  • Phpstorm怎样批量删除空行?
  • TCP拥塞控制
  • vue 配置sass、scss全局变量
  • Vue.js源码(2):初探List Rendering
  • Vue学习第二天
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 百度小程序遇到的问题
  • 程序员最讨厌的9句话,你可有补充?
  • 搭建gitbook 和 访问权限认证
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 和 || 运算
  • 前端面试总结(at, md)
  • 如何优雅地使用 Sublime Text
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #stm32驱动外设模块总结w5500模块
  • #图像处理
  • (1) caustics\
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计ssm电影分享网站
  • (南京观海微电子)——COF介绍
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)c52学习之旅-点亮LED灯
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .form文件_一篇文章学会文件上传
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET程序员迈向卓越的必由之路
  • .NET构架之我见
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色