我有一套下列物品

Set<String> formatLookup = new HashSet<>();
formatLookup.add("DHMdhm");
formatLookup.add("THMthm");
formatLookup.add("JHMjhm");

我正在传递一个字符串,如下所示
String filterVal = "THM";

现在,我要检查过滤器值是否存在于集合的索引中(过滤器值顺序可能与thm、htm、mht等不同),并且我要从集合返回该项。下面是代码,它正在工作。
private static String getStoredFilter(String filterVal) {
    String format = "DHMdhm";
    boolean found = false;
    Set<String> formatLookup = new HashSet<>();
    formatLookup.add("DHMdhm");
    formatLookup.add("THMthm");
    formatLookup.add("JHMjhm");
    Iterator<String> setIterator = formatLookup.iterator();
    while (setIterator.hasNext()) {
        String fmt = setIterator.next();
        for (int j = 0; j < filterVal.length(); j++) {
            if (!(fmt).contains(String.valueOf(filterVal.charAt(j)))) {
                found = false;
                break;
            } else {
            found = true;
            }
        }
        if (found) {
            return fmt;
        }
    }
    return null;
}

我想使用java8特性。我是java8新手,我尝试过stream和foreach。但是,由于foreach无法返回值,所以我不确定如何完成此操作。
你能帮我一下吗?

最佳答案

只需将键和输入都放入一个规范排列中,就可以处理排列,例如,只需对它们进行排序:

static String canonical(String s) {
    char[] c = s.toCharArray();
    Arrays.sort(c);
    return String.valueOf(c);
}

准备从规范键到指定字符串的映射
// do this only once
private static final Map<String,String> formatLookup
    = Stream.of("DHMdhm", "THMthm", "JHMjhm")
            .collect(Collectors.toMap(s -> canonical(s), Function.identity()));

以及实际操作
private static String getStoredFilter(String filterVal) {
    String key = canonical(filterVal);

    // check whether there's an exact match
    String quickChecked = formatLookup.get(key);
    if(quickChecked!=null) return quickChecked;

    // search for substring matches
    return formatLookup.entrySet().stream()
        .filter(e -> e.getKey().contains(key))
        .map(Map.Entry::getValue)
        .findAny().orElse(null);
}

如果字符串可能包含重复的字符,并且您希望处理这些字符,则只需更改canonical方法,例如。
static String canonical(String s) {
    return s.codePoints().collect(BitSet::new, BitSet::set, BitSet::or).stream()
        .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
        .toString();
}

关于java - 如何使用Java8功能根据参数从集合中获取项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47942253/

10-10 02:45