我有两个问题。
1
我想将Lambda转换为Java函数,但不知道该怎么做。
//GET Method For REST Application
public Topic getTopics(String id){
return topics.stream().filter(t -> t.getId().equals(id)).findFirst().get();
}
topics
是一个定义为:
private List<Topic> topics = new ArrayList<Topic>(
Arrays.asList(
new Topic("1","Spring Framework","Spring")
)
);
班级Topic
定义为:
public class Topic {
public String id;
public String name;
public String description;
public Topic() {}
public Topic(String id, String name, String description) {
super();
this.id = id;
this.name = name;
this.description = description;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getId(){
return this.id;
}
}
2
我还有一个关于代码的问题。它是关于过滤功能。为什么只有t
可以用作谓词?将鼠标悬停在t上给出了这个定义
Topic t - project_path.getTopics(...).() -> {...} Predicate.test(Topic)
答案 0 :(得分:3)
您的过滤器组合器中的lambda可以被提取到变量(谓词)中:
Predicate<Topic> hasSameId = topic -> id.equals(topic.getId());
或方法:
Boolean hasSameId(Topic topic) {
return id.equals(topic.getId());
}
在任何一种情况下,尽管通过讨论任何一个版本来传递id
是一个好习惯:
Function<String, Predicate<Topic>> hasSameId = id -> topic -> id.equals(topic.getId());
然后可以像这样使用:
topics.stream().filter(hasSameId.apply(id)).findFirst();
答案 1 :(得分:1)
您肯定需要了解有关JAVA 8流的更多信息。无论如何这里是你的问题的答案:
public Topic getTopics(String id) {
return topics.stream().filter(t -> t.getId().equals(id)).findFirst().get();
}
与
相同public Topic getTopics(String id) {
for (Topic curTopic:topics) {
if (curTopic.getId().equals(id)) return curTopic;
}
return null;
}
其次,对于你的第二个问题,你可以使用任何东西作为形式参数,所以下面也可以正常工作(另见Syntax of Lambda Expression):
public Topic getTopics(String id) {
return topics.stream().filter(p -> p.getId().equals(id)).findFirst().get();
}
希望能帮助你:)