1,为何要介绍java8的相关特性?java
由于如今的企业大部分已经从java7向java8开始迈进了,用java8的公司愈来愈多了,java8中的一些知识仍是须要了解一些的;数据结构
java8具备如下特色:app
速度更快(底层的数据结构作了一些更新和改动,垃圾回收机制内存结构作了一些改动)
代码更少(增长了新的语法 Lambda 表达式)
强大的 StreamAPI
便于并行
最大化减小空指针异常(Optional 容器类)dom
主要内容:
一、Lambda 表达式
二、函数式接口
三、方法引用与构造器引用
四、StreamAPI
五、接口中的默认方法与静态方法
六、新时间日期 API
七、其余新特性ide
一,Lambda表达式函数
什么是lambda表达式?spa
Lambda 表达式是一个匿名函数,咱们能够把 Lambda 表达式理解为是一段能够传递的代码(将代码像数据同样进行传递)。能够写出更简洁、更灵活的代码。做为一种更紧凑的
代码风格,使得 Java 语言表达能力获得了提高。Java8 中引入了一个新的操做符”->”该操做符称为箭头操做符或 Lambda 操做符,箭头操做符将 Lambda 表达式拆分为两部分:
左侧:Lambda 表达式的参数列表。对应接口中抽象方法的参数列表。右侧:Lambda 表达式中所须要执行的功能,即 Lambda 体。对应接口中抽象方法的实现。指针
Lambda 表达式的基础语法code
public class Java8Test { /* 无参数,无返回值 * */ @Test public void test01(){ Runnable r=new Runnable() { @Override public void run() { System.out.println("liuqingfeng"); } }; r.run(); System.out.println("****************"); Runnable r2= () -> System.out.println("hello lambda!"); r2.run(); } //有一个参数,无返回值 @Test public void test02(){ Consumer<String> con=(t) -> System.out.println(t); con.accept("1"); } //只有一个参数,小括号能够省略不写 @Test public void test03(){ Consumer<String> con= t -> System.out.println(t); con.accept("2"); } //有两个以上的参数 ,有返回值 , 而且Lambda体中有多条语句 @Test public void test04(){ Comparator<Integer> com=(x,y) ->{ System.out.println("hello world"); Integer a=Integer.compare(x,y); System.out.println(a); return a; }; int i = com.compare(8, 4); System.out.println(i); } //若Lambda体中只有一条语句,return 和大括号均可以省略不写 @Test public void test05(){ Comparator<Integer> com = (x,y) -> Integer.compare(x,y); System.out.println(com.compare(1,2)); } //Lambda 表达式的参数列表的数据类型能够省略不写,由于 JVM 编译器经过上下文推断出 //数据类型,即“类型推断” @Test public void test06(){ Comparator<Integer> com = (Integer x, Integer y) -> Integer.compare(x, y); show(new HashMap<>());// jdk1.8 之后 } public void show(Map<String, Integer> map) { } //使用函数式接口 @Test public void test7() { Integer result = operation(100, (x) -> x * x); System.out.println(result); result = operation(200, (y) -> y - 100); System.out.println(result); } public Integer operation(Integer num, MyFunction<Integer> mf) { return mf.getValue(num); } @FunctionalInterface public interface MyFunction<T> { public T getValue(T o); } }
二,四大内置核心函数式接口blog
public class test8_02 { /* * Consumer<T> 消费型接口 * void accept(T t); */ @Test public void test01(){ happy(10000,(m)->System.out.println("杜立宏要去大保健")); } public void happy(double money, Consumer<Double> con){ con.accept(money); } //供给型接口 @Test public void test02(){ List<Integer> numlist=getNumList(10,()->(int)(Math.random()*100)); System.out.println(numlist.toString()); } public List<Integer> getNumList(int num,Supplier<Integer> sup){ List<Integer> list=new ArrayList<>(); for(int i=0;i<num;i++){ list.add(sup.get()); } return list; } //函数型接口 @Test public void test03(){ String newStr=strHandler(" shsxt ",(str)->str.trim()); System.out.println(newStr); System.out.println("**********************"); newStr=strHandler("bjsxt",(str)->str.substring(1,3)); System.out.println(newStr); } public String strHandler(String str, Function<String,String> fun){ return fun.apply(str); } //断言型接口 @Test public void test04(){ List<String> list= Arrays.asList("hello","world","123","ok","God"); list= stringFilter(list,(str)->str.length()>3); System.out.println(list.toString()); } public List<String> stringFilter(List<String> list, Predicate<String> pre){ List<String> li=new ArrayList<>(); for(String str:list){ if(pre.test(str)){ li.add(str); } } return li; }