首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8流代码重构

Java 8流代码重构
EN

Stack Overflow用户
提问于 2016-12-22 09:18:35
回答 5查看 2.4K关注 0票数 2

我使用Java 8实现了以下代码。

代码语言:javascript
复制
Map<String, String> coMap = getHashMap();

String newCoName = coMap.entrySet()
                     .stream()
                     .filter(coEntry -> coEntry.getValue().equals(newcoId))
                     .map(coEntry -> coEntry.getKey())
                     .collect(Collectors.joining());


String oldCoName = coMap.entrySet()
                     .stream()
                     .filter(coEntry -> coEntry.getValue().equals(oldcoId))
                     .map(coEntry -> coEntry.getKey())
                     .collect(Collectors.joining());

现在。我想知道更好的方法来做到这一点,而不是重复相同的代码行两次。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-12-22 09:21:42

因为所有的区别都是id,所以一个简单的方法就可以实现这一点。

代码语言:javascript
复制
String getName(int id) { // supposed id is an integer
    return coMap.entrySet()
             .stream()
             .filter(coEntry -> coEntry.getValue().equals(id))
             .map(coEntry -> coEntry.getKey())
             .collect(Collectors.joining()); 
}
票数 5
EN

Stack Overflow用户

发布于 2016-12-22 09:32:43

比重复两次相同的代码更大的问题是执行两次相同的代码。

运行一个Stream管道来生成您的输出会更有效:

代码语言:javascript
复制
Map<String,String> keysByValue =
            coMap.entrySet()
                 .stream()
                 .collect(Collectors.groupingBy(Map.Entry::getValue,
                                                Collectors.mapping(Map.Entry::getKey,
                                                                   Collectors.joining())));

这将为原始Map的每个值(不仅是原始代码正在搜索的两个值)提供该值的联合键。

然后可以从Map中提取所需的数据:

代码语言:javascript
复制
String newCoName = keysByValue.get(newcoId);
String oldCoName = keysByValue.get(oldcoId);

样本输入和输出:

代码语言:javascript
复制
Map<String,String> coMap = new HashMap<> ();
coMap.put("a","foo");
coMap.put("b","foo");
coMap.put("c","bar");
coMap.put("d","bar");
Map<String,String> keysByValue = ... // same as the code above
String newValueKeys = keysByValue.get("foo");
String oldValueKeys = keysByValue.get("bar");
System.out.println (newValueKeys);
System.out.println (oldValueKeys);

产出:

代码语言:javascript
复制
ab
cd
票数 10
EN

Stack Overflow用户

发布于 2016-12-22 09:42:00

与FunctionalInterface Predicate一起使用的其他方法,条件筛选器将是动态的。

代码语言:javascript
复制
public static Predicate<Map.Entry> getPredicate(String col) {
    return p -> p.getValue().equals(col);
}

public static String getName(HashMap<String, String> coMap, Predicate<Map.Entry> predicate) {
    return coMap.entrySet()
            .stream()
            .filter(predicate)
            .map(coEntry -> coEntry.getKey())
            .collect(Collectors.joining());
}

调用您的代码:

代码语言:javascript
复制
  getName(coMap, getPredicate(newcoId));
  getName(coMap, getPredicate(oldcoId));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41279574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档