比较字符串] []数组与一组对象.并带有重复的返回设置



我想将字符串数组与对象集的集合进行比较,其中对象具有字符串字段。然后返回等于给定字符串的对象。但是,如果可能的话,我想避免每个循环。

任何想法我该如何使用流API?

所以让我粘贴一些示例代码:

    class TestObj {
    private String str;
    private String name;
    public TestObj(String str, String name) {
        this.setStr(str);
        this.setName(name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getStr() {
        return str;
    }
    public void setStr(String str) {
        this.str = str;
    }
}

实际代码是:

    Set<TestObj> allObjects = new HashSet<>();
    allObjects.add(new TestObj("s", "aaa"));
    allObjects.add(new TestObj("d", "uuu"));
    allObjects.add(new TestObj("a", "ggg"));
    allObjects.add(new TestObj("c", "dd"));
    String[] arr = {"a", "b", "e", "f"};
    Set<TestObj> objectsToReturn = new HashSet<>();

    for (String string : arr) {
        for (TestObj testObj : objectsToReturn) {
            if(string.equals(testObj.getStr())) {
                objectsToReturn.add(testObj);
            }
        }
    }

我想首先强调对每个循环做到这一点没有错误的。使用流甚至可能引入一些开销。

也就是说,一种使用流的方法是:

String[] arr = {"a", "b", "e", "f"};
List<String> arrList = Arrays.asList(arr); // create a List from the array so that we can call "contains".
                                           // If the array is constant, you should just directly create a List instead.
Set<TestObj> objectsToReturn =
        allObjects.stream()
        .filter(x -> arrList.contains(x.getStr()))
        .collect(Collectors.toSet());

如果您的数组被排序,则不需要List,并且可以调用binarySearch查看数组是否包含元素:

Set<TestObj> objectsToReturn =
        allObjects.stream()
        .filter(x -> Arrays.binarySearch(arr, x.getStr()) >= 0)
        .collect(Collectors.toSet());

您将字符串与错误的对象进行比较。在内部的面孔循环中,您是通过对objectstoreturn进行迭代的,该绕线是空的。要修复它,只需更改:

for (TestObj testObj : objectsToReturn) {

to:

for (TestObj testObj : allObjects) {

最新更新