为什么我们不能为地图创建流?
我想使用lambda函数创建一个FileNameFilter.
我的主要问题是我想在函数内部引入一个循环.我尝试使用过滤器,但我无法根据外部列表创建过滤器.
以下是我的代码:
File targetDir = new File(path);
FilenameFilter deleteFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
for(String tag: pageTagsList){
if(name.equals(tag))
return true;
}
return false;
}
};
File[] foundFiles = targetDir.listFiles(deleteFilter);
Run Code Online (Sandbox Code Playgroud)
我想做的是这样的:
File[] foundFiles = targetDir.listFiles(
(dir,name)->pageTagsList.stream()
.filter(//code to filter here)
.orElse(false)
);
Run Code Online (Sandbox Code Playgroud)
有没有正确的方法来做到这一点?
我有这个定义开发人员的类.
class Developer {
private final String name;
Set<String> skills = new HashSet<>();
public Developer(final String name, final String... skills) {
this.name = name;
for (final String skill : skills) {
this.skills.add(skill);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在创建一个开发人员列表.
List<Developer> developers = new ArrayList<>();
people.add(new Developer("Bill", "Javascript", "HTML", "CSS"));
people.add(new Developer("Bob", "Java", "OOP", "Agile"));
people.add(new Developer("Barry", "Data Mining", "Machine Learning", "R"));
Run Code Online (Sandbox Code Playgroud)
现在我想提取一套集体技能.我是这样使用的flatMap:
Set<String> skills = developers.stream().flatMap(dev -> dev.skills.stream()).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
有没有办法通过Streams而不使用flatMap?
我有像下面的代码中提到的字符串数组.我正在消除每个元素中存在的双引号但我必须在最后一个索引上执行额外的操作,因为我知道还有额外的双引号.
String array[] = new String[]{"\"Awesome Systems, Inc. - 357", "\"Awesome Systems, Inc - 357", "\"wpe_stage\""};
Arrays.stream(array).map((str) -> (str = str.trim())
.substring(1, str.length()))
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
我得到的是像以下那样的输出
Awesome Systems, Inc. - 357
Awesome Systems, Inc - 357
wpe_stage"
Run Code Online (Sandbox Code Playgroud)
所需的输出如下 -
Awesome Systems, Inc. - 357
Awesome Systems, Inc - 357
wpe_stage
Run Code Online (Sandbox Code Playgroud)
如何使用流功能或lambda来完成此操作?有没有办法在流中选择最后一个索引,还是可以根据索引进行任何过滤?
我有一个叫做Data只有一种方法的类:
public boolean isValid()
Run Code Online (Sandbox Code Playgroud)
我有一个List,Data我想通过Java 8流循环它们.我需要计算其中valid Data有多少个对象List并仅打印valid条目.
下面是我走了多远,但我不明白怎么做.
List<Data> ar = new ArrayList<>();
...
// ar is now full of Data objects.
...
int count = ar.stream()
.filter(Data::isValid)
.forEach(System.out::println)
.count(); // Compiler error, forEach() does not return type stream.
Run Code Online (Sandbox Code Playgroud)
我的第二次尝试:(可怕的代码)
List<Data> ar = new ArrayList<>();
...
// Must be final or compiler error will happen via inner class.
final AtomicInteger counter = new AtomicInteger();
ar.stream()
.filter(Data:isValid)
.forEach(d -> …Run Code Online (Sandbox Code Playgroud) 我想用Streams来实现以下目的:
我有完整不同结构的列表Input和Output对象.
使用for循环,我可以将a转换List<Input>为a List<Output>,如下所示:
for (Input input : listOfInput) {
Output currentOutPutInstance = new Output();
currentOutPutInstance.setArg1(input.getArg2());
currentOutPutInstance.setArg2(input.getArg7());
listOfOutPuts.add(currentOutPutInstance);
}
Run Code Online (Sandbox Code Playgroud)
有了溪流,我试过这样的事情:
private List<Output> getOutPutListFromInputList(List<Input> inPutList) {
List<Output> outPutList = new ArrayList<Output>();
outPutList = listOfPoolsInRun.stream.filter(<Somehow converting the input into output>)
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
注意: 我不确定Stream我应该使用哪种方法.我filter只是用来显示一些虚拟代码.
用java 8 stream()重写这个迭代的最佳方法是什么.
for (name : names){
if(name == a){
doSomething();
break;
}
if(name == b){
doSomethingElse();
break;
}
if(name == c){
doSomethingElseElse();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果满足其中任何条件,则在3个条件下迭代列表,想要打破循环,并且在每个条件中都想调用不同的方法.
我需要将字符串List转换为userdefinedType数组,对于数组我需要将字符串转换为long.
我已经使用以下方法实现了相同的目标
TeamsNumberIdentifier[] securityPolicyIdArray = securityPolicyIds.stream()
.map(securityPolicy -> new TeamsNumberIdentifier(Long.valueOf(securityPolicy)))
.collect(Collectors.toCollection(ArrayList::new))
.toArray(new TeamsNumberIdentifier[securityPolicyIds.size()]);
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来转换它?
我有以下声明:
Function<Stream<Supplier<Collection<? extends User>>>, Stream<User>> userStreamSupplier =
supStream -> {
ArrayList<User> list = new ArrayList<>();
supStream.forEach(sup -> list.addAll(sup.get()));
return list.stream();
};
Run Code Online (Sandbox Code Playgroud)
是否可以将内部lambda中的循环转换为智能stream.reduce操作(或其他聚合)?我试过各种方法,但我失败了.
问候,JG.
我有这个代码:
private ConcurrentMap<String, Integer> myMap = new ConcurrentHashMap<>();
@Scheduled(fixedDelay = 600_000)
public void foo(){
myMap.values().stream().
filter(predicate()).
forEach(this::remove);
}
public void insert(String str, Integer value){
myMap.put(str, value);
}
Run Code Online (Sandbox Code Playgroud)
如果在遍历此地图时会发生什么 - 有人会在其中添加新值或从中删除现有值?
java ×10
java-stream ×10
java-8 ×5
lambda ×4
collections ×1
concurrency ×1
filter ×1
filtering ×1
string ×1