首页 > 解决方案 > Java Stream API 查找包含字符列表的单词

问题描述

我正在学习 Java 8,我试图减少对 for 循环的使用,并使我的代码看起来很干净。我正在尝试找出解决以下问题的方法。我有一个单词列表和一个字符数组,例如:

 List<String> words = new ArrayList<>();
     words.add("go");
     words.add("me");
     words.add("boy");
     words.add("ate");
     words.add("mate"); 
     words.add("goal");

 char[] required_chars =  {'e', 'o', 'b', 'a', 'm', 'g', 'l'} ;

输出应该是 (go, me, goal),因为这些单词包含 required_chars 数组中的字符/字母。它应该只严格使用数组中的元素。我怎样才能做到这一点?

标签: javalambdajava-8java-stream

解决方案


import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class FilterListStreamWithCharArray {

    public static void main(String[] args) {

        List<String> words = new ArrayList<>();
        words.add("go");
        words.add("me");
        words.add("boy");
        words.add("ate");
        words.add("mate");
        words.add("goal");

        char[] required_chars = { 'e', 'o', 'b', 'a', 'm', 'g', 'l' };

        Set<Character> requiredCharsAsSet = getBoxedChars(required_chars);

        List<String> filteredWords = words.stream().filter(eachElement -> {

            char[] eachElementsCharArray = eachElement.toCharArray();

            Set<Character> eachElemenstCharAsSet = getBoxedChars(eachElementsCharArray);

            if (requiredCharsAsSet.containsAll(eachElemenstCharAsSet)) {
                return true;
            }

            return false;
        }).collect(Collectors.toList());

        System.out.println(filteredWords);

    }

    private static Set<Character> getBoxedChars(char[] charArray) {

        Set<Character> resultSet = new HashSet<>();

        for (int i = 0; i < charArray.length; i++) {
            resultSet.add(new Character(charArray[i]));
        }
        return resultSet;
    }
}

推荐阅读