了解 Java 8 个 Lambda 表达式
Understanding Java 8 Lambda Expressions
我在 Java 8 上阅读 this article 并且有以下内容 questions/comments 我会很感激一些 feedback/response。
1) 以下代码是否需要@FunctionalInterface
声明?还是可以在没有它的情况下执行相同的代码并且它是为了文档目的?是否有必要从文章中看不清楚。
@FunctionalInterface
private interface DTOSender {
void send(String accountId, DTO dto);
}
void sendDTO(BisnessModel object, DTOSender dtoSender) {
//some logic for sending...
...
dtoSender.send(id, dto);
...
}
2)一般来说,在Java8中,一个函数可以作为参数传递给另一个函数吗?我的理解是只有数据类型可以作为参数传递给函数,所以我认为这是不可能的,因为函数不是数据类型。
3) 我是否需要做任何特别的事情来完成上面的#2,或者我可以只写我对这 2 个方法的定义并将一个方法作为参数传递给另一个方法吗?
4) Java8 中可以将对象作为参数传递给另一个函数吗?我是否需要做任何特殊的事情来完成此操作,或者我是否可以只编写对象和方法的定义并将对象作为参数传递给方法?
注释 @FunctionalInterface 并非如文档所述那样是强制性的。
为了将函数传递给您的方法,必须有一个匹配的函数接口。
interface ListFilter<T> {
boolean test(T item);
}
public static <T extends Comparable<T>> List<T> filter(List<T> list, ListFilter<T> filter) {
List<T> filteredList = new ArrayList<>();
for (T t : list) {
if (filter.test(t)) {
filteredList.add(t);
}
}
return filteredList;
}
public static boolean isNumberGreaterThan2(Integer integer){
return integer > 2;
}
public static void main(String[] args) {
List<Integer> list = List.of(1, 2, 3, 4);
filter(list, new ListFilter<Integer>() {
@Override
public boolean test(Integer item) {
return item > 2;
}
});
// or
filter(list, item -> item > 2);
// or
filter(list, Main::isNumberGreaterThan2);
}
@Functional Interface
只是一个提示,所以你不要在你的界面中放入更多的方法。
可以。 Stream
上的许多方法都将函数作为参数:Stream.of(1, 2, 3).forEach(System.out::println)
.
Lambda 是一个函数实例:Function<Integer, Integer> f = a -> a + 1
。编辑:您可以使用方法引用按名称传递函数(参见 2.,println
是常规方法)。
我没有完全理解问题。如果该方法使用任何参数,即不是原始参数,则它需要一个对象(java 中除原始类型之外的所有内容都是对象)。
我在 Java 8 上阅读 this article 并且有以下内容 questions/comments 我会很感激一些 feedback/response。
1) 以下代码是否需要@FunctionalInterface
声明?还是可以在没有它的情况下执行相同的代码并且它是为了文档目的?是否有必要从文章中看不清楚。
@FunctionalInterface
private interface DTOSender {
void send(String accountId, DTO dto);
}
void sendDTO(BisnessModel object, DTOSender dtoSender) {
//some logic for sending...
...
dtoSender.send(id, dto);
...
}
2)一般来说,在Java8中,一个函数可以作为参数传递给另一个函数吗?我的理解是只有数据类型可以作为参数传递给函数,所以我认为这是不可能的,因为函数不是数据类型。
3) 我是否需要做任何特别的事情来完成上面的#2,或者我可以只写我对这 2 个方法的定义并将一个方法作为参数传递给另一个方法吗?
4) Java8 中可以将对象作为参数传递给另一个函数吗?我是否需要做任何特殊的事情来完成此操作,或者我是否可以只编写对象和方法的定义并将对象作为参数传递给方法?
注释 @FunctionalInterface 并非如文档所述那样是强制性的。
为了将函数传递给您的方法,必须有一个匹配的函数接口。
interface ListFilter<T> {
boolean test(T item);
}
public static <T extends Comparable<T>> List<T> filter(List<T> list, ListFilter<T> filter) {
List<T> filteredList = new ArrayList<>();
for (T t : list) {
if (filter.test(t)) {
filteredList.add(t);
}
}
return filteredList;
}
public static boolean isNumberGreaterThan2(Integer integer){
return integer > 2;
}
public static void main(String[] args) {
List<Integer> list = List.of(1, 2, 3, 4);
filter(list, new ListFilter<Integer>() {
@Override
public boolean test(Integer item) {
return item > 2;
}
});
// or
filter(list, item -> item > 2);
// or
filter(list, Main::isNumberGreaterThan2);
}
@Functional Interface
只是一个提示,所以你不要在你的界面中放入更多的方法。可以。
Stream
上的许多方法都将函数作为参数:Stream.of(1, 2, 3).forEach(System.out::println)
.Lambda 是一个函数实例:
Function<Integer, Integer> f = a -> a + 1
。编辑:您可以使用方法引用按名称传递函数(参见 2.,println
是常规方法)。我没有完全理解问题。如果该方法使用任何参数,即不是原始参数,则它需要一个对象(java 中除原始类型之外的所有内容都是对象)。