如何在 Collector 中使用 If 语句?

How can I use an If-statement inside the Collector?

我需要的输出是这样的:

"Versions" : [("0.1","true"),("0.2","false"),("0.3","true")]

这个输出的结构是:Map<String, List<Pair<String, String>>>

其中 "Versions" 是 Map 的键,[("0.1","true"),("0.2","false"),("0.3","true")] 这是 Map 的值。

现在,在 Map 中我们有一个 List 像:List<Pair<String, String>> 例如:[("0.1","true"),("0.2","false"),("0.3","true")]

其中 "0.1","0.2","0.3"Pair 的键,"true","false","true"Pair 的值。

如何为此 Pair 编写 if-else 语句?对于特定条件,我希望 Pair 的值返回为 truefalse?

您可以通过调用静态方法 Map.entry() 来利用现有的映射条目实现,该方法需要一个键和一个值(仅适用于 Java 9 及更高版本) 或者直接调用map入口的构造函数:

new AbstractMap.SimpleEntry<>(key, value)

属性 key 定义为 final 并且 value 是可变的。如果您对此不满意(例如,如果您需要一个不可变对象),您可以定义自己的class Pair.

public class Pair<K, V> {
    private final K key;
    private final V value;
    
    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }
    
    // getters
}

How do I write an if-else statement for this Pair? Where for a particular condition I want the value of the Pair to be returned as true or false?

对于您的条件逻辑(if 您提到的语句),您可以在收集器中 in-line (如下图)或者提取到一个单独的方法中,如果有多个条件,这将是一个更好的选择。

您的代码唯一需要做的更改是将 Collectors.mapping() 中的字符串连接替换为创建映射条目的表达式( 或您的自定义 class) 将表示版本的连接字符串作为键,将条件的结果作为值。

Collectors.mapping(cae -> Map.entry(cae.getMajorVersion() + "." + cae.getMinorVersion(),
                                    String.valueOf(your_condition)), 
            Collectors.toList())

创建一个 method/Function 接受 CorporateActionEvent 和 returns 一个 Pair<String, String> :

public static Pair<String, String> getPair(CorporateActionEvent cae){
   boolean myCondition; //= check whatever
   String key = cae.getMajorVersion() + "." + cae.getMinorVersion();
   return new Pair(key, String.valueOf(myCondition));
}

并通过调整对应的映射来使用

....Collectors.mapping(cae -> getPair(cae), Collectors.toList())));

或使用方法参考,假设您将 getPair 方法放在 CorporateActionEvent class:

....Collectors.mapping(CorporateActionEvent::getPair, Collectors.toList())));