从多个条件中过滤出结果

时间:2019-02-01 09:35:09

标签: java collections java-8

我有一个包含empidname列表的Map。我只想选择emp name大于7并且名字以N开头的人中的id个。 结果必须是SET。

我尝试使用map.entryset(),但不知道如何在地图内部进行过滤。

是否还需要使用?  如果找到多个元素,我们将如何返回设置?

4 个答案:

答案 0 :(得分:3)

应该是这样的

Set<String> selectedEmps = empIdToName.entrySet().stream()
    .filter(e -> e.getKey() > 7)
    .filter(e -> e.getValue().startsWith("N"))
    .map(Map.Entry::getValue)
    .collect(Collectors.toSet());

答案 1 :(得分:1)

如果我对您的理解正确,请采取以下解决方案: 假设我们有以下数据:

import org.openqa.selenium.support.pagefactory.ByChained;
import org.openqa.selenium.By;
import static org.openqa.selenium.By.linkText;
import static org.openqa.selenium.By.cssSelector;

public static By chain(final By... bys) {
        return new ByChained(bys);
    }

public void yourClickMethodOnAElements(final String name) {
        click(chain(cssSelector("div.tabs > a"), linkText(name)));
    }
public WebElement click(final By by) {
        return click(driver.findElement(by));
    }

public WebElement click(WebElement element) {
        Actions action = new Actions(driver);
        action.moveToElement(element).click().perform();
        sleepIfNeeded();
        return element;
    }

我们可以通过以下方式过滤数据:

Map<String, List<Integer>> map = new HashMap<>();

map.put("Noo", new ArrayList<>(Arrays.asList(8,8,9)));
map.put("No", new ArrayList<>(Arrays.asList(1,8,9)));
map.put("Aoo", new ArrayList<>(Arrays.asList(8,8,9)));

第一个过滤器排除不以map.entrySet(). stream() .filter(e -> e.getKey().startsWith("N")) .filter(e -> e.getValue().stream().filter(id -> id <= 7).findAny().orElse(0) == 0) .map(Map.Entry::getKey) .collect(Collectors.toSet()); 开头的名称,第二个过滤器遍历其余条目并检查其所有"N"是否都大于7。在foreach中,我只打印数据,但是您可以根据需要更改逻辑

结果应为:

ids

答案 2 :(得分:1)

可以通过简单的for循环轻松完成:

Map<Integer, String> map = ...
Set<String> result = new HashSet<>();
for(Map.Entry<Integer, String> entry : map.entrySet()){
    if(entry.getKey() > 7){
        String name = entry.getValue();
        if(name.charAt(0) == 'N'){
            result.add(name);
        }
    }
}

注意:如果名称可以为空(length() == 0),则name.charAt(0)方法将不起作用,因为您将获得StringIndexOutOfBoundsException

答案 3 :(得分:0)

Map<Integer, String> nameMap = new HashMap<>(); //A dummy map with empid and name of emp
public static void main(String[] args) {
    nameMap.put(1,"John");
    nameMap.put(2,"Doe");
    nameMap.put(37,"Neon");
    nameMap.put(14,"Shaun");
    nameMap.put(35,"Jason");
    nameMap.put(0,"NEO");
    Set<String> empSet = nameMap.entrySet()
                        .stream()
                        .filter(x->x.getKey()>7 && x.getValue().startsWith("N"))
                        .map(x->x.getValue())
                        .collect(Collectors.toSet());
    empSet.forEach(System.out::println);
}
  

实际的实现和名称空间会有所不同,但基本   操作将保持不变。