最近在工做中看到同事在用java8新特性,今天就给你们带来java8新特性的一些简要介绍,若有不足,敬请指正。java
在数据结构这块,好比java8对HashMap进行了优化,在之前的基础上加入了红黑树,速度更快,提升了效率。最大化减小空指针异常 Optional,在内存这块也作了优化处理,感兴趣的小伙伴能够详细了解下。这里再也不赘述。数据结构
其中最重要的仍是咱们的Lambda表达式和Stream API。ide
先来体会一下Lambda表达式和Stream API:咱们在开发过程当中常常遇到这样的需求:找出年龄大于20岁的对象。使用了Lambda表达式和Stream API后能够极大减小代码量。提升开发效率。函数
package com.rrss.test; /** * @author lzx * * 实体类 */ public class People { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public People() { super(); } public People(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "People [name=" + name + ", age=" + age + "]"; } }
package com.rrss.test; import java.util.Arrays; import java.util.List; import org.junit.Test; /** * @author lzx * */ public class LambdaTest { @Test public void testLambda() { List<People> peoples = Arrays.asList( new People("张三", 18), new People("李四", 25), new People("王五", 30) ); //找出年龄大于20的对象 peoples.stream() .filter((t) ->t.getAge()>20) .forEach(System.out::println); System.out.println("------华丽分割线------"); //找出全部对象的名字 peoples.stream() .map(People::getName) .forEach(System.out::println); } }
测试结果 |
---|
![]() |
由此看出Lambda表达式和Stream ApI 是很强大的,减小不少的冗余代码。 |
接下来咱们来详解Lambda表达式测试
3、Lambda表达式优化
下面咱们来详细介绍Lambda表达式基础语法。this
须要注意的是,Lambda表达式须要函数式接口的支持。3d
函数式接口:接口中只有一个抽象方法的接口称为函数式接口。咱们能够用@FunctionalInterface来修饰接口,检查接口是不是函数式接口。指针
package com.rrss.test; /** * @author lzx * */ @FunctionalInterface public interface LambdaInterface { void show(int name); }
以上就是一个函数式接口,若是在此接口中继续增长抽象方法则会报错(@FunctionalInterface来修饰)。code
在java8中引入了一个新的操做符“->”,称为箭头操做符或者Lambda操做符,此符号将表达式拆分红两部分。
左侧部分为Lambda表达式参数列表,右侧部分为表达式中须要执行的功能。
package com.rrss.test; import org.junit.Test; /** * @author lzx * */ public class LambdaGrammer { @Test public void test1() { // 以前写法 Runnable r1 = new Runnable() { @Override public void run() { System.out.println("Hello World"); } }; r1.run(); // Lambda表达式 Runnable r = () -> System.out.println("Hello Lambda"); r.run(); } }
执行结果 |
---|
![]() |
先看Consumer接口 |
---|
![]() |
@Test public void test2() { Consumer<String> consumer = (x) -> System.out.println(x); consumer.accept("Hello world"); }
测试结果 |
---|
![]() |
@Test public void test3() { Consumer<String> consumer = x -> System.out.println(x); consumer.accept("Hello world"); }
测试结果 |
---|
![]() |
@Test public void test4() { Comparator<Integer> comparable = (x, y) -> { System.out.println("语法4"); return Integer.compare(x, y); }; }
@Test public void test5() { Comparator<Integer> comparable = (x, y) -> Integer.compare(x, y); }
package com.rrss.test; /** * @author lzx * */ @FunctionalInterface public interface MyInterface { int excute(int num); }
package com.rrss.test; import org.junit.Test; /** * @author lzx * */ public class LambdaPractice { @Test public void testLambda() { int num = calc(10, (x) -> x + 100); System.out.println("加法运算:" + num); } @Test public void testLambdaFun() { int num = calc(10, (x) -> x * 100); System.out.println("乘法运算:" + num); } public int calc(int num, MyInterface data) { return data.excute(num); } }
未完待续...