我刚刚开始熟悉lambda。我可以用更简单的方法解决问题。但是我认为此版本的解决方案会给人留下深刻的印象。 让我解释一下...
我有一个List<Object>
..我想遍历列表内的所有对象,并且我想调用一个依赖于Object字段之一的方法。该方法返回一个布尔值。
这是我问题的主要部分。我想将它们收集到Map<Boolean, Object>
中,因此,如果该方法成功运行,则在我漂亮的Map中需要一个K:true,V:Object;如果未成功运行,则需要Map中的一个K:false,V:Object ... 等等。
这是我的代码:(其中“数据”是我的List<Object>
)
Map<Boolean, ToDo> result = data.stream().collect(Collectors.toMap(
task -> {
if (task.getTask().equalsIgnoreCase("Foo")) {
foo.handle(task);
} else if (task.getTask().equalsIgnoreCase("Boo")) {
boo.handle(task);
}
}, task -> task
));
答案 0 :(得分:2)
首先使用键-值映射填充映射,其中键来自if检查,值是处理程序实现,例如foo,bar等。然后像这样在lambda表达式中使用该映射,
+--------------+--------------+
| author_fname | author_lname |
+--------------+--------------+
| Dan | Harris |
| Freida | Saunders |
| George | sth |
+--------------+--------------+
请注意,使用下游收集器将具有相同密钥的对象收集到容器中。
假设:Map<String, Handler> nameToHandler = new HashMap<>();
nameToHandler.put("Foo", new FooHandler());
nameToHandler.put("Bar", new BarHandler());
Map<Boolean, List<ToDo>> result = data.stream()
.collect(Collectors.partitioningBy(task ->
nameToHandler.get(task.getTask()).handleTask(task)));
和FooHandler
实现了BarHandler
接口。理想情况下,此Handler
应该是map
,并且可能会在静态初始化程序块中进行初始化。这是实际的样子。
static
偶尔会注意到Java静态初始化程序是线程安全的。但是,如果要确保代码一次执行完,则需要确保该类仅由单个类加载器加载。静态初始化每个类加载器执行一次。
答案 1 :(得分:0)
然后您将只有两个...在地图中可能有三个条目(true,false和null):)。
也许最好使用tqdm.write
作为键,使用ToDo
作为值。
然后,如果您想知道给定的Boolean
返回的方法的结果,您将调用ToDo