java新特性之Lambda表达式

函数式编程

关注做什么,不关心是怎么实现的。为了实现该思想,java有了一种新的语法格式,Lambda表达式。Lambda本质是匿名内部类对象,是一个函数式接口。函数式接口表示接口内部只有一个抽象方法。使用该语法可以大大简化代码。

  • 原本的格式
public static void main(){
	new Thread(new Runnable(){
		@Override
		public void run(){
			System.out.println("线程任务");
		}
	}).start();
}
  • Lambda表达式
new Thread(
() -> System.out.println("线程任务"); ).start();

函数式接口

即Simple Abstract Methods接口,只有一个抽象方法需要重写的接口。可以使用@FunctionalInterface来验证接口是否是函数式接口。

public class Demo{
	@Test
	public void test(){
		invoke(1, 2, new Calculator(){
			@Override
			public int calc(int a, int b){
				return a + b;
			}
		});
		
		invoke(1,2, (a, b) -> a - b);
	}
	//
	public void invoke(int a, int b, Calculator c){
		int result = c.calc(a, b);
		System.out.println(result);
	}
}

//函数式接口
public interface Calculator{
	public int calc(int a, int b);
}

语法格式:

  • Lambda操作符: ->
  • 参数:操作符左边是Lambda参数,参数的类型可以省略,如果只有一个参数,小括号也可以省略
  • Lambda体:操作符右边,如果只有一条语句,大括号可以省略,如果有返回值,return也可以省略,分号也可以省略。

消费型接口

java提供的函数式接口:Consumer接口

@Test
public void test(){
	List<String> list = new ArrayList<>();
	list.add("tom");
	list.add("jack");
	list.add("rose");
	list.add("jerry");
	//forEach()里面的Consumer对象是一个函数式接口
	list.forEach(s -> System.out.println(s));
}
@Test
public void test(){
	Map<String> map = new HashMap<>();
	map.add("tom", 1);
	map.add("jack", 2);
	map.add("rose", 3);
	map.add("jerry", 4);
	//forEach()里面的Consumer对象是一个函数式接口
	map.forEach((k, v) -> System.out.println(k +"="+v));
}

供给型接口

@Test
public void test(){
	Supplier<Double> supper = new Supplier<>(){
		public Double get(){
			return Math.random();
		}	
	};

	//lambda
	Supplier<Double> supplier = () -> Math.random();

	//----------应用--------------
	Stream<Double> stream = stream.generate(
		() -> Math.random();
	);
}

功能型接口

@Test
public void test(){
	List<String> list = new ArrayList<>();
	list.add("tom");
	list.add("jack");
	list.add("rose");
	list.add("jerry");
	//替换所有元素
	//方法内部需要的是一个功能型函数apply()
	list.replaceAll(s -> s.toUpperCase());
	//forEach()遍历
	list.forEach(s -> System.out.println(s));
}

判断型接口

@Test
public void test(){
	List<String> list = new ArrayList<>();
	list.add("tom");
	list.add("jack");
	list.add("rose");
	list.add("jerry");
	
	list.removeIf(new Predicate<String>(){
		public boolean test(String s){
			return s.length() > 4;
		}
	});
	
	//lambda
	list.removeIf(s -> s.length() < 4);
	
	//forEach()里面的Consumer对象是一个函数式接口
	list.forEach(s -> System.out.println(s));
}

方法引用表达式

当Lambda符号左右两边的参数一致时,可以简化为类名::方法名的形式。

构造器引用表达式

当表达式左右两边的参数一致时,可以简化为类名::new的形式。

你可能感兴趣的:(java)