嵌套For Loop转换为Lambda和地图比较

我正在努力将现有的forloop转换为lambda表达式。 我有一个对象列表(List<Task>),其中包含一个名为“ InputData”(Map<String,String>)的映射。 我还有另一个Map<String,String>(接受)。

我想过滤Task.InputData映射包含所有“ acceptance”映射条目的Task对象列表。 Task.InputData可能包含其他条目,但我要强制执行A​​cceptance中存在的var,必须在Task.InputData中存在。

现有的for循环如下所示:

boolean addTask;
List<Task> finalResults = new ArrayList<>();
for (Task t : results) {
      addTask = true;
      for (Entry<String,String> k : kvVars.entryset()) {                
            if (!t.getInputData().containsKey(k) || !t.getInputData().get(k).equals(k.getvalue())) {
                  addTask = false;
            }
      }

      if (addTask) {
            finalResults.add(t);
      }
}

无论是应该尝试结合平面图和过滤条件,还是应该遵循现有for循环中的逻辑,我对这种方法都感到困惑。

woshiriluobingcheng1 回答:嵌套For Loop转换为Lambda和地图比较

您可以使用filter来收集所有Task,它们在InputData中具有所有“接受” k / v。

List<Task> finalResults = results.stream()
                                 .filter(t->kvVars.entrySet()
                                                  .stream()
                                      .allMatch(k->t.getInputData().containsKey(k.getKey()) 
                                                   && t.getInputData().get(k.getKey()).equals(k.getValue()))
                                 .collect(Collectors.toList());
,

您可以在输入数据映射的条目集上使用import AppKit enum StyleKit { static func drawIcon(frame: CGRect) { let circle = NSBezierPath(ovalIn: frame.insetBy(dx: 1,dy: 1)) NSColor.controlAccentColor.setFill() circle.fill() } } let iconView = NSImageView() iconView.image = .init(size: .init(width: 24,height: 24),flipped: true) { drawingRect in StyleKit.drawIcon(frame: drawingRect) return true } import PlaygroundSupport PlaygroundPage.current.liveView = iconView 来检查您的状况:

Set.containsAll
本文链接:https://www.f2er.com/3135521.html

大家都在问