lambda函数式编程总结

lambda函数式编程总结

lambda是java8版本的新特性,其主要针对于函数式接口(就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口)

函数式语言提供了一种强大的功能——闭包(函数中,能访问函数外的变量,并且函数外的变量值改变后,会影响函数内的计算)

相比于传统的编程方法有很多优势,闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。Java 现在提供的最接近闭包的概念便是 Lambda 表达式,虽然闭包与 Lambda 表达式之间存在显著差别,但至少 Lambda 表达式是闭包很好的替代者。

Lambda语法:

()->{}
()里面存放的是参数
{}重写抽象方法具体逻辑
->执行方法体

1.无参无返回值

public class FLambda {
	public static void main(String[] args) {
    functionlambda n1 = ()->{
    	System.out.println("无参无返回值");
    };
    n1.show();
	}
}
interface functionlambda {
	void show();
}

2.无参有返回值

public class FLambda {
	public static void main(String[] args) {
		functionlambda n1 = () -> {
			return 5;

		};
		System.out.println(n1.show());
	}
}

interface functionlambda {
	int show();
}

3.有一个参数有返回值

public class FLambda {
	public static void main(String[] args) {
		functionlambda n1 = (a) -> {
			return 5+a;

		};
		System.out.println(n1.show(5));
	}
}

interface functionlambda {
	int show(int a );
}

4.多个参数有返回值

public class FLambda {
	public static void main(String[] args) {
		functionlambda n1 = (a,b) -> {
			return b+a;

		};
		System.out.println(n1.show(5,6));
	}
}

interface functionlambda {
	int show(int a,int b );
}

5.有一个参数无返回值

public class FLambda {
	public static void main(String[] args) {
		functionlambda n1 = (a) -> {
			System.out.println(a);

		};
		n1.show(10);
		
	}
}

interface functionlambda {
	void show(int a);
}

6.有多个参数无返回值

public class FLambda {
	public static void main(String[] args) {
		functionlambda n1 = (a,b) -> {
			
			System.out.println(a+b);

		};
		n1.show(7, 3);
		
	}
}

interface functionlambda {
	void show(int a,int b );
}

如果对自己编写的函数式接口判断不出错误,可以添加**@FunctionalInterface 注解**,帮助判断是否是函数式接口.

lambda省略原则:

1.参数类型可以省略,当出现多个参数时,如果省略必须全部省略

2.若只有一个参数,可以省略()

3.方法体中只有一条语句,可以省略{}

4.如果方法体中,唯一一条语句是return 可以省略return关键字

lambda方法引用:

它的作用是将一个lambda表达式指向一个已经实现的方法,下面我们举例说明一下

public class FLambda {
	public static void main(String[] args) {
		functionlambda n1 = a -> change(a);
		System.out.println(change(7));
		
	}
	public static int change(int a ) {
		return a*2;
	}
}

interface functionlambda {
	void show(int a);
}

上面的lambda方法体中引用了change方法.

1.静态方法引用

语法: 类名**:?*静态方法

与静态方法调用.作用相同,但是要注意一点 change(),show()两者之间的参数类型,参数数量,返回值类型必须保持一致

public class FLambda {
	public static void main(String[] args) {
		functionlambda n1 = FLambda::change;
		System.out.println(n1.show());
		}
	public static int change() {
		return 5; 
	}
}
interface functionlambda {
	int show();
}

2.非静态方法

语法: 对象名::非静态方法

public class FLambda {
	public static void main(String[] args) {
		functionlambda n1 =fflambda::doshow;
		System.out.println(n1.show(1));//这个传任意参数,都是打印777 因为方法引用 返回777 
		}
	}
interface functionlambda {
	int show(int a);
}
class fflambda{
	public static int doshow(int a ) {
		return 777;
	}
}

3.构造方法

语法: 对象名::new

用法与上面的都是相同的,只是关键字需要用new,在此不进行举例说明了.

lambda实用案例

1.用于集合排序,将persion对象按着年龄升序

public class text {
	public static void main(String[] args) {
		ArrayList<persion> a = new ArrayList<>();
		Collections.addAll(a, new persion("小明", 17), new persion("小王", 11), new persion("小李", 19),
				new persion("小刘", 10));
		a.sort((o1, o2) -> o1.age - o2.age);
		System.out.println(a);
	}
}

2.用于TreeSet自定义排序(1.在persion中实现Comparable接口, 2.通过外部比较器Compator来进行自定义),在没有指定规则对set对象进行排序,程序运行会出现异常

public class text01 {
	public static void main(String[] args) {

		TreeSet<persion> a = new TreeSet<>((o1, o2) -> o1.age - o2.age);
		Collections.addAll(a, new persion("小明", 17), new persion("小王", 11), new persion("小李", 19),
				new persion("小刘", 10));
		System.out.println(a);
	}
}

你可能感兴趣的:(java)