Java lambda和HashMap <boolean,object =“”>

时间:2019-01-26 00:00:00

标签: java lambda java-8 hashmap

我刚刚开始熟悉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
    ));

2 个答案:

答案 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