将Lambda转换为Java函数

时间:2018-06-19 05:00:36

标签: java lambda java-8

我有两个问题。

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)

2 个答案:

答案 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();
}

希望能帮助你:)