java8中重要的4个新特性:

  • Lambda
  • Stream
  • Optional
  • 日期时间API
  • 接口方法(default和static方法,jdk9可定义private方法)

一、Lambda

 import java.util.Comparator;
import java.util.function.Consumer; /**
* @author zhaojigang
* @date 2018/5/19
*/
public class LambdaTest {
/**
* Lambda 是一个匿名函数。
* 1、语法
* Lambda表达式引入了操作符为"->",该操作符将Lambda分为两个部分:
* 左侧:指定了Lambda表达式需要的所有参数
* 右侧:指定了Lambda体,即Lambda表达式要执行的功能。
*
* 2、示例
*/
public void testLambda() {
/**
* 语法格式一:无参,无返回值
*/
Runnable task = () -> System.out.println("hello lambda");
/**
* 语法格式二:一个参数,无返回值
* 注意:参数类型可以通过
*/
Consumer<String> consumer = str -> System.out.println(str);
/**
* 语法格式三:一个参数,有返回值
* 注意:当Lambda体只有一条语句时,省略大括号和return
*/
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
} /**
* 函数式接口:只包含一个抽象方法的接口。
* 1、可以通过Lambda表达式来创建该接口的对象
* 2、可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口
*
* Java内置了四大核心函数式接口:
* 1、Consumer<T>:void accept(T t),消费型接口
* 2、Supplier<T>:T get(),供给型接口
* 3、Function<T, R>:R apply(T t),函数型接口
* 4、Predicate<T>:boolean test(T t),断言型接口
* 还有部分子接口。
*/
public void testFunctionalInterface() {
Consumer<String> consumer = str -> System.out.println(str);
}
}

二、Stream

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalLong;
import java.util.stream.LongStream; /**
* @author zhaojigang
* @date 2018/5/19
*/
public class StreamTest { static List<Integer> integerList = new ArrayList<Integer>() {{
add(1);
add(2);
add(3);
add(4);
add(5);
add(5);
add(5);
}}; static List<Integer> integerList2 = new ArrayList<Integer>() {{
add(10);
add(20);
add(30);
}}; static Map<String, List<Integer>> map1 = new HashMap<>(); static {
map1.put("list1", integerList);
map1.put("list2", integerList2);
} /**
* 分片与筛选
*/
public static void test1() {
integerList.stream()
.filter(x -> x > 2) // 3,4,5,5,5
.skip(2) //5,5,5
.limit(2) //5,5 短路:一旦获取到2个元素后不再向后迭代
.distinct() //
.forEach(System.out::println);
} /**
* 映射
* map(Function f):接收一个函数作为参数,该函数会被应用到每个元 素上,并将其映射成一个新的元素
* flatMap(Function f):接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
*/
public static void test2() {
integerList.stream()
.map(x -> x + 10)
.forEach(System.out::println); map1.values().stream()
.flatMap(x -> x.stream()) // x是每一个List,flatMap将每一个List的Stream合并起来
.forEach(System.out::println); } /**
* 排序
* sorted():产生一个新流,其中按自然顺序排序(按照元素的Comparable接口)
* sorted(Comparator comp):产生一个新流,其中按比较器顺序排序(按照自定义的Comparator)
*/
public static void test3() {
integerList.stream()
.sorted()
.forEach(System.out::println); integerList.stream()
.sorted((x, y) -> {
if (x < y) {
return 1;
} else {
return -1;
}
})
.forEach(System.out::println); } /**
* 查找与匹配
* allMatch(Predicate p):检查是否匹配所有元素
* anyMatch(Predicate p):检查是否至少匹配一个元素
* noneMatch(Predicate p):检查是否没有匹配所有元素
* findFirst():返回第一个元素
* findAny():返回当前流中的任意元素
* count():返回流中元素总数
* max(Comparator c):返回流中最大值
* min(Comparator c):返回流中最小值
*/
public static void test4() {
final boolean allMatch = integerList.stream().allMatch(x -> x > 4);
final boolean anyMatch = integerList.stream().anyMatch(x -> x > 4);
final boolean noneMatch = integerList.stream().noneMatch(x -> x > 4);
final Optional<Integer> first = integerList.stream().filter(x -> x > 3).findFirst();
final Optional<Integer> any = integerList.stream().filter(x -> x > 3).findAny();
final long count = integerList.stream().filter(x -> x > 4).count();
final Optional<Integer> max = integerList.stream()
.max((x, y) -> {
if (x < y) {
return 1;
} else {
return -1;
}
}); } /**
* 规约
* <p>
* reduce(T iden, BinaryOperator b):可以将流中元素反复结合起来,得到一个值。返回T,其中iden是初始值
* reduce(BinaryOperator b):可以将流中元素反复结合起来,得到一个值。返回Optional<T>
*/
public static void test5() {
// 计算:100+1+2+3+4+5+5+5
final Integer sum = integerList.stream().reduce(100, (x, y) -> x + y);
final Optional<Integer> sumOptional = integerList.stream().reduce((x, y) -> x + y);
} /**
* 收集
* 常用:
* 1、将流元素收集到List:List<Employee> emps= list.stream().collect(Collectors.toList());
* 2、将流元素收集到Set:List<Employee> emps= list.stream().collect(Collectors.toSet());
* 3、连接流中每个字符串:String str= list.stream().map(Employee::getName).collect(Collectors.joining());
* 4、分组: Map<Emp.Status, List<Emp>> map= list.stream().collect(Collectors.groupingBy(Employee::getStatus));
*
* 不常用:
* 1、根据true或false进行分区:Map<Boolean,List<Emp>>vd= list.stream().collect(Collectors.partitioningBy(Employee::getManage));
* 2、根据比较器选择最大值:Optional<Emp>max= list.stream().collect(Collectors.maxBy(comparingInt(Employee::getSalary)));
* 3、根据比较器选择最小值:Optional<Emp> min = list.stream().collect(Collectors.minBy(comparingInt(Employee::getSalary)));
* 4、将流元素收集到任意指定集合:Collection<Employee> emps=list.stream().collect(Collectors.toCollection(ArrayList::new));
* 5、计算流中元素的个数:long count = list.stream().collect(Collectors.counting());
* 6、对流中元素的属性求和:int total=list.stream().collect(Collectors.summingInt(Employee::getSalary));
* 7、计算流中元素Integer属性的平均值:double avg= list.stream().collect(Collectors.averagingInt(Employee::getSalary));
*/
public static void test6() {
} /**
* 并行流与串行流
* 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
* 底层:fork/join
* Stream API可以声明性地通过parallel()与sequential()在并行流与顺序流之间进行切换
*/
public static void test7(){
long start = System.currentTimeMillis(); final OptionalLong sum = LongStream.rangeClosed(0, 100000000000L)
.parallel()
.reduce(Long::sum); System.out.println(sum + "-" + (System.currentTimeMillis() - start));
} public static void main(String[] args) {
test7();
}
}

三、Optional

 import java.util.Optional;

 /**
* @author zhaojigang
* @date 2018/5/19
*/
public class OptionalTest { public static void main(String[] args) {
// String godName = "shijia";
String godName = null;
// 常用方式
final String god = Optional.ofNullable(godName).orElse("yesu");
System.out.println(god);
}
}

四、日期时间API

 import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; /**
* @author zhaojigang
* @date 2018/5/19
*/
public class TimeTest { /**
* 一、日期创建:
* LocalDate localDate = LocalDate.now();
* LocalTime localTime = LocalTime.now();
* LocalDateTime localDateTime = LocalDateTime.now();
*
* LocalDate localDate = LocalDate.of(2016, 10, 26);
* LocalTime localTime = LocalTime.of(02, 22, 56);
* LocalDateTime localDateTime = LocalDateTime.of(2016, 10, 26, 12, 10, 55);
*
* 二、日期加减运算
* plusDays, plusWeeks, plusMonths, plusYears
* minusDays, minusWeeks, minusMonths, minusYears
* plus, minus
*
* 三、日期比较计算
* isBefore, isAfter
*
* 四、是否闰年
* isLeapYear
*
* 五、时间戳与时间间隔运算
* Instant 时间戳:以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算
* Duration:用于计算两个“时间”间隔
* Period:用于计算两个“日期”间隔
*
* 六、时间校正器
* TemporalAdjuster/TemporalAdjusters 调整时间:例如获取下一个周日等
*
* 七、日期解析和格式化
* java.time.format.DateTimeFormatter类
*/
public static void main(String[] args) {
/**
* 计算时间间隔
*/
Instant in1 = Instant.now();
Instant in2 = Instant.now();
System.out.println(Duration.between(in1, in2).toMillis()); /**
* 日期格式化
*/
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime time1 = LocalDateTime.now();
String formatDateTime = time1.format(formatter); /**
* 日期解析
*/
LocalDateTime dateTime = LocalDateTime.parse(formatDateTime, formatter);
}
}

日期操作我们通常会使用Apache commons包,但是这样就会引入一个包,能够使用java本身的就是用java本身的。

五、接口方法

 /**
* @author zhaojigang
* @date 2018/5/19
*/
public class InterfaceTest {
public static void main(String[] args) {
MyImpl myClass = new MyImpl();
System.out.println(myClass.getName());
System.out.println(MyInterface.getAge());
}
} interface MyInterface {
default String getName(){
return "nana";
} static Integer getAge(){
return 18;
}
} /**
* 若一个接口中定义了一个默认方法,而另外一个父类中又定义了一个同名的方法时,取父类
* 若一个接口中定义了一个默认方法,而另外一个实现接口中又定义了一个同名的方法时,实现类需要执行重写其中一个
*/
class MyImpl implements MyInterface {
}

在jdk9中,接口中可以定义private方法。

1.3 java8新特性总结的更多相关文章

  1. java8新特性全面解析

    在Java Code Geeks上有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Java ...

  2. Java8新特性

    Java8新特性 Java8主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等. 1.函数式接口 Java 8 引入 ...

  3. Java系列 - 用Java8新特性进行Java开发太爽了

    本人博客文章网址:https://www.peretang.com/using-java8s-new-features-to-coding-is-awesome/ 前言 从开始写博客到现在已经过去3个 ...

  4. Java8 新特性之Stream----java.util.stream

    这个包主要提供元素的streams函数操作,比如对collections的map,reduce. 例如: int sum = widgets.stream() .filter(b -> b.ge ...

  5. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  6. Java8新特性之二:方法引用

    上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...

  7. Java8新特性(一)_interface中的static方法和default方法

    什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...

  8. Java8 新特性 | 如何风骚走位防止空指针异常

    文章整理翻译自 https://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/ 文章首发于个人网站: https://www.exce ...

  9. 干货 | Java8 新特性教程

    本教程翻译整理自 https://github.com/winterbe/java8-tutorial 本教程首发自个人网站: https://www.exception.site/java8/jav ...

  10. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

随机推荐

  1. Python学习(八) —— 内置函数和匿名函数

    一.递归函数 定义:在一个函数里调用这个函数本身 递归的最大深度:997 def func(n): print(n) n += 1 func(n) func(1) 测试递归最大深度 import sy ...

  2. Python自用笔记

    函数:raw_input()和input() 注意:在python3.x中,已经删除raw_input(),取而代之的是input(),当然这仅仅是重命名,用法还是一样.因此在这里介绍的是python ...

  3. 关闭PHP的opcache缓存

    1.使用phpinfo();查看配置信息 2.搜索Additional .ini files parsed 3.查看opcache安装目录 4.打开文件将   opcache.enable=1 改成  ...

  4. 洛谷3825 [NOI2017]游戏 2-sat

    原文链接http://www.cnblogs.com/zhouzhendong/p/8146041.html 题目传送门 - 洛谷3825 题解 我们考虑到地图中x的个数很少,最多只有8个. 所以我们 ...

  5. day40 mycql 视图,触发器,存储过程,函数

    视图,触发器,存储过程,自定义函数 -- 回顾 1.mysql 约束 1.非空 not null 2. 主键约束 primary key 3. 唯一约束 unique 4. 外键约束 foreign ...

  6. Qt错误 —— 无法启动此程序 因为计算机丢失QtCore5.dll 以及 无法定位程序输入点于动态链接库QtCore5.dll

    首先,设置计算机的环境变量Path,计算机=>右键属性=>高级设置=>环境变量=>系统变量=>双击Path,在Path后面增加C:\Qt\Qt5.8.0\5.8\ming ...

  7. create-react-app项目添加less配置

    使用create-react-app 创建的项目默认不支持less,以下增加less配置的步骤 暴露配置文件 create-react-app生成的项目文,看不到webpack相关的配置文件,需要先暴 ...

  8. 003.MongoDB主要概念

    一 对比关系 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行 ...

  9. input模拟输入下拉框

       功能点: 输入.下拉选择.根据输入内容模糊检索.键盘上下键选择 实现思路: 显示隐藏: input获取焦点显示,失去焦点隐藏 下拉选择: 以父元素为基准,通过绝对定位定位至input输入下方 模 ...

  10. MySQL5.6 大量SQL语句处于Writing to net状态的案例分析

    [问题现象] 开发同事反馈有应用在21:00-22:00之间出现大量超时报错. [问题分析] 1. 从DB服务器慢查询指标来看,18:00后有大量的慢查询,累计产生了约9000条慢查询 2. 测试直接 ...