@Override
public void start(Stage primaryStage) throws Exception {
String[] options = new String[]{"A", "B", "C", "D", "E", "F"};
GridPane grid = new GridPane();
for (int i = 0; i < options.length; i++) {
final int row = i;
String option = options[i];
CheckBox checkBox = new CheckBox(option);
ChoiceBox<Integer> choice = new ChoiceBox<>();
Label label = new Label("How many of the selected accounts do you have?");
choice.getItems().addAll(1, 2, 3, 4, 5);
VBox choiceContainer = new VBox(label, choice);
checkBox.selectedProperty().addListener((o, oldValue, newValue) -> {
if (newValue) {
grid.add(choiceContainer, 1, row);
} else {
grid.getChildren().remove(choiceContainer);
}
});
grid.add(checkBox, 0, row);
}
Scene scene = new Scene(grid);
primaryStage.setScene(scene);
primaryStage.show();
}
这是代码。 如何为上述foreach语句编写lambda?我正在尝试,但无法获得最佳解决方案,所以任何人都可以吗?
答案 0 :(得分:1)
Linq 和扩展方法不应真正尝试解决所有问题。但是,如果您确实需要一个语句中的所有内容,则可以使用它。
AList.SelectMany(x => x.body.positions)
.ToList()
.ForEach(
position =>
position.NameOfWeek = weekList.Where(x => x.NameOfWeek == position.NameOfWeek)
.Select(y => y.NameOfWeek)
.FirstOrDefault());
注意 :如果此内容出现在我的办公桌上供代码检查,请id将其发送回并附带一条注释,说“我的眼睛”! ,请重构。
基本上,您的原始foreach
易于阅读和维护。它并不想太花哨,您可以轻松地看到发生了什么。要使所有内容都在一个声明中,这些特质就变得更加重要。
答案 1 :(得分:1)
那么,您可以使用linq函数SelectMany。这是修改后的版本:
foreach(var position in AList.SelectMany(k => k.body.positions)) {
position.NameOfWeek = weekList
.Where(x => x.NameOfWeek.ToString() == position.NameOfWeek)
.Select(y => y.NameOfWeek)
.FirstOrDefault();
}