标签: java-stream

0
推荐指数
1
解决办法
88
查看次数

如何在JAVA中使用lambda函数中的循环?

我想使用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)

有没有正确的方法来做到这一点?

java lambda filter java-stream

0
推荐指数
1
解决办法
851
查看次数

在不使用flatMap的情况下实现flatMap效果

我有这个定义开发人员的类.

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?

java java-stream

0
推荐指数
1
解决办法
95
查看次数

基于索引过滤Java Stream或使用lambda修改最后一个数组值

我有像下面的代码中提到的字符串数组.我正在消除每个元素中存在的双引号但我必须在最后一个索引上执行额外的操作,因为我知道还有额外的双引号.

    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来完成此操作?有没有办法在流中选择最后一个索引,还是可以根据索引进行任何过滤?

java string lambda filtering java-stream

0
推荐指数
1
解决办法
359
查看次数

Java - forEach的基本流使用

我有一个叫做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)

java java-stream

0
推荐指数
1
解决办法
391
查看次数

如何使用Streams将一种类型的List转换为另一种类型的List?

我想用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 java-8 java-stream

0
推荐指数
1
解决办法
125
查看次数

在java 8中使用流迭代列表

用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个条件下迭代列表,想要打破循环,并且在每个条件中都想调用不同的方法.

java lambda java-8 java-stream

0
推荐指数
2
解决办法
1486
查看次数

使用Java 8将一种类型的List转换为另一种类型的Array

我需要将字符串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)

有没有更好的方法来转换它?

java java-8 java-stream

0
推荐指数
1
解决办法
159
查看次数

Java Stream API - 如何减少循环以减少

我有以下声明:

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.

java lambda java-stream

0
推荐指数
1
解决办法
91
查看次数

在迭代它时从ConcurrentHashMap添加和删除值

我有这个代码:

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 collections concurrency java-8 java-stream

0
推荐指数
1
解决办法
2929
查看次数