一、Lambda表达式
java8中Lambda表达式的书写方式:
(参数) -> 表达式
(参数) -> 单行语句
(参数) -> { 语句 }
1.Lambda遍历List和Map
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.yanwu.www.demo; /** * @author Harvey */ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Demo1 { public static void main(String[] args) { List list=new ArrayList<>(); Map<String,Object> map=new HashMap(); list.add("aa"); list.add("bb"); list.add("cc"); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); //原始遍历List方法 for(String str:list){ System.out.println(str); } System.out.println("======Lambda操作list的for each循环=========="); list.forEach(obj->{ obj=obj.toUpperCase(); System.out.println(obj); }); System.out.println("********对Map进行操作*********"); //原始遍历Map方法 for(Map.Entry<String, Object> entry:map.entrySet()){ System.out.println(entry.getKey()+":"+entry.getValue()); } System.out.println("======Lambda操作map的循环=========="); map.forEach((K,V)->{ System.out.println(K+":"+V); }); } }
二、接口的默认方法
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.yanwu.www.demo; /** * @ClassName: Demo2 * @Description: TODO(这里用一句话描述这个类的作用) * @author Harvey * @date 2017年7月31日 下午10:01:57 * */ interface Demo{ void test1(); //default关键字,接口的默认方法 default void test2(){ System.out.println("this is test2()"); } } public class Demo2 { public static void main(String[] args) { Demo d=new Demo(){ @Override public void test1() { // TODO Auto-generated method stub System.out.println("this is test1()"); } }; d.test1();//实例化的时候已经实现 d.test2();//直接可以调用 } }
三、方法和构造函数的引用
Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用。一共定义了四种形式:
- 引用静态方法:类名称 :: static 方法名称;
- 引用某个对象的方法:实例化对象 :: 普通方法
- 引用特定类型的方法:特定类 :: 普通方法
- 引用构造方法: 类名称::new
引用静态方法:类名称 :: static 方法名称
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.yanwu.www.demo; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; /** * @ClassName: Person * @Description: TODO(这里用一句话描述这个类的作用) * @author Harvey * @date 2017年7月31日 下午10:17:26 * */ @FunctionalInterface //只能定义一个方法 interface Demo3<P,R>{ R test3(P p); } public class Person { private int age; private String name; private String sex; public Person(){} public void test1(){ System.out.println("this is normal method test1()"); } public static void test2(){ System.out.println("this is static method test2()"); } public static void main(String[] args) { Person p=new Person(); p.test1(); Person.test2(); Demo3<Integer,String> d0=String::valueOf;//对静态方法的引用 System.out.println(d0.test3(1)); } }
(其他例子暂略)
四、函数式接口包以及提供的四个核心函数式接口
包:java.util.function
四个核心接口:
1.功能性接口: public interface Function<T, R> {R apply(T t);} //接收一个参数,返回一个处理结果
2.消费型接口:public interface Consumer<T> {void accept(T t);} //负责接收数据,并且不返回处理结果
3.供给型接口:public interface Supplier<T> { T get();} //不接收参数,可以返回结果
4.断言性接口 : public interface Predicate<T> {boolean test(T t);} //进行判断操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.www.yanwu.Annotation; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; /** * @ClassName: Demo4 * @Description: TODO(这里用一句话描述这个类的作用) * @author Harvey * @date 2017年7月31日 下午11:25:38 * */ public class Demo4 { public static void main(String[] args) { String str="##hello"; //测试功能性接口,有参数,有返回值 Function<String,Boolean> fun=str::startsWith; System.out.println(fun.apply("#")); //测试消费型接口,有参数,无返回值 Consumer c=System.out::println; c.accept("hello world"); //测试供给型接口,没有参数,有返回值的 Supplier s=str::toUpperCase; System.out.println(s.get()); //测试断言型接口,有参数,返回布尔型 Predicate p=str::equalsIgnoreCase; System.out.println(p.test("##hello")); } }