Java8的重要新特性

一、Lambda表达式

java8中Lambda表达式的书写方式: 
(参数) -> 表达式 
(参数) -> 单行语句 
(参数) -> { 语句 } 

1.Lambda遍历List和Map

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);
		});
	
	}
	
	
	
}
View Code

二、接口的默认方法

Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法。

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();//直接可以调用
	}
}

View Code

三、方法和构造函数的引用

Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用。一共定义了四种形式:

  • 引用静态方法:类名称 :: static 方法名称;
  • 引用某个对象的方法:实例化对象 :: 普通方法
  • 引用特定类型的方法:特定类 :: 普通方法
  • 引用构造方法: 类名称::new

引用静态方法:类名称 :: static 方法名称

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));
		
	}	
	
}
View Code

(其他例子暂略)

四、函数式接口包以及提供的四个核心函数式接口

包: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);} //进行判断操作

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"));
		
	}
	
}

View Code
原文地址:https://www.cnblogs.com/harvey2017/p/7266336.html