我有一个包含empid
和name
列表的Map。我只想选择emp name
大于7并且名字以N开头的人中的id
个。
结果必须是SET。
我尝试使用map.entryset()
,但不知道如何在地图内部进行过滤。
是否还需要使用? 如果找到多个元素,我们将如何返回设置?
答案 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);
}
实际的实现和名称空间会有所不同,但基本 操作将保持不变。