什么是lambda 表达式?
lambda 表达式主要是将之前面向对象的传递数据思想改变为传递行为.
lambda 表达式的好处有哪些?
- 匿名
这里所谓的匿名不是向Java8之前的匿名,而是表达的意思是写得少而想的多 - 函数
我们说它是函数是因为lambda函数不像方法那样属于某个特定的类,但和方法一样,lambda有参数列表,函数主体,返回类型,还有可能抛出异常列表 - 传递
lambda表达式可以作为参数传递给方法 - 简洁
无需向匿名类那样写很多模板方法
lambda 表达式结构
(args) -> {code segment}
函数式接口
public interface Predicate<T> {
boolean test(T t);
}
一言以蔽之,函数式接口就是只定义一个抽象接口的方法.类似的有 runnable,callable,comparator 等等
函数式接口可以干什么呢?
lambda表达式允许你以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例.
@FunctionalInterface
当某个接口加上FunctionalInterface标识,表示这个接口会设计成函数式接口
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
@FunctionalInterface
public interface Predicate<T> {
/**
* @param t
* @return
*/
boolean test(T t);
}
public static void main(String[] args) {
List<Integer> filter = filter(Arrays.asList(1, 2, 3, 4, 5), i -> i > 3);
filter.forEach(integer -> System.out.println(integer));
List<Integer> map = map(Arrays.asList(1, 2, 3, 4, 5), i -> i * 2);
map.forEach(i -> System.out.println(i));
}
/**
* @param list
* @param predicate
* @param <T>
* @return
*/
public static <T> List<T> filter(List<T> list, Predicate<T> predicate) {
List<T> result = new ArrayList<>();
for (T t : list) {
if (predicate.test(t)) {
result.add(t);
}
}
return result;
}
/**
*
* @param list
* @param function
* @param <T>
* @param <R>
* @return
*/
public static <T, R> List<R> map(List<T> list, Function<T, R> function) {
List<R> result = new ArrayList<>();
for (T t : list) {
result.add(function.apply(t));
}
return result;
}
方法引用
在我看来方法引用并没有什么用处,只是让你的代码更简洁,但是阅读起来我觉得不是很好理解,可能因人而异,所以我不太喜欢使用方法引用.
网友评论