我可以通过哪种方式在Java中使用List写下for循环?

时间:2018-07-29 01:46:59

标签: java lambda refactoring

是否可以使用Lambda表达式或更好的方式写下for循环?

public TaskDTO convertToDTO(Task task) {
    for (int i = 0; i < task.getPrecedingTasks().size(); i++)
        this.precedingTasks.add(task.getPrecedingTasks().get(i).getName());
}

3 个答案:

答案 0 :(得分:1)

这是一个完整的示例,我在其中放置了System.out.println ...,您应该使用this.precedingTasks.addAll(...

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {

        Task t1 = new Task("myTask", Arrays.asList(new Task("innerTask1"), new Task("innerTask2")));
        System.out.println(t1.precedingTasks.stream().map(Task::getName).collect(Collectors.toList()));

    }

    static class Task {

        private String name;
        private List<Task> precedingTasks = new ArrayList<>();

        public Task(String name) {
            this.name = name;
        }

        public Task(String name, List<Task> precedingTasks) {
            this.name = name;
            this.precedingTasks = precedingTasks;
        }

        public String getName() {
            return name;
        }

        public List<Task> getPrecedingTasks() {
            return precedingTasks;
        }
    }
}

输出为

[innerTask1, innerTask2]

答案 1 :(得分:1)

您的解决方案很好:

  

task.getPrecedingTasks()。stream()。map(Task :: getName).forEach(this.precedingTasks :: add);

但是由于您只是在检索Taskmap然后是collect的列表,所以是:

this.precedingTasks = task.getPrecedingTasks().stream().map(Task::getName).collect(Collectors.toList());

它不是更直接,更容易理解吗?由于stream在这里要做映射/转换然后收集。

也通过这种方式,您不需要将this.precedingTasks初始化为

this.precedingTasks = new ArrayList<>(); // to ensure it's not null;

无论如何,这里只是个人喜好。

答案 2 :(得分:0)

我为自己的情况找到了正确的解决方案:

task.getPrecedingTasks().stream().map(Task::getName).forEach(this.precedingTasks::add);

感谢您的提示: