标签: java-8

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

我想用Streams来实现以下目的:

我有完整不同结构的列表InputOutput对象.

使用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
查看次数

在迭代它时从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
查看次数

如何为lambda表达式指定类型?

我试过了:

Stream stream = Pattern.compile(" ").splitAsStream(sc.nextLine());
stream.forEach(item) -> {});
Run Code Online (Sandbox Code Playgroud)

得到了:

Compilation Error... 
 File.java uses unchecked or unsafe operations.
 Recompile with -Xlint:unchecked for details.
Run Code Online (Sandbox Code Playgroud)

所以我试过了:

Stream stream = Pattern.compile(" ").splitAsStream(sc.nextLine());
stream.forEach((String item) -> {});
Run Code Online (Sandbox Code Playgroud)

得到了:

Compilation Error... 
15: error: incompatible types: incompatible parameter types in lambda expression
            stream.forEach((String item) -> {});
                           ^
 Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
Run Code Online (Sandbox Code Playgroud)

我怎样才能进行这个.forEach()传递编译?

java generics java-8

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

任何类似过滤器的lambda操作都不会丢弃?

我基本上想做的事情如下:

  assertEquals(Arrays.asList(1,2,3).stream()
                                   .noDiscardingFilter(x -> x!=1)
                                   .map(x -> x*10)
                                   .collect(Collectors.toList()),  
                Arrays.asList(1,20,30)
              )
Run Code Online (Sandbox Code Playgroud)

这是一个例子,我不需要得到如何解决这个特定问题的答案,这只是一个例子来展示我正在追求的奇特东西.

java lambda java-8 java-stream

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

Java Stream:如何在每个elemnt上传递Set to Stream.of()和call方法?

我有这样的旧式代码:

        if (setContainer.getSet() == null) {
            return null;
        }
        for (SetElement setElement : setContainer.getSet()){
            if ("SomeString".equals(SetElement.getCode())) {
                return  setElement.getValue();
            }
        }
        return null;
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它不会检查Set是否为null:

setContainer.getSet()
                    .stream()
                    .filter(setValue ->  "SomeValue".equals(setElement.getCode()))
                    .map(SetElement::getValue)
                    .findAny()
                    .orElse(null) ;
Run Code Online (Sandbox Code Playgroud)

据我所知,我应该使用,Stream.of() 但我不明白如何执行上面的代码,因为它总是返回Optional<Set<SetElement>>

java java-8 java-stream

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

聚合两个以上的Java 8属性

我很简单

 class Per{
    int a;
    long b;
    double c;
    String d;
}
Run Code Online (Sandbox Code Playgroud)

假设我有3000个类型的对象Per并收集在一个List<Per> pers

现在我想实现: -

  • 如果跳过对象为空或dnullblank
  • 总和 a
  • 总和 b
  • 执行的操作的聚合值 c

老路是

int totalA = 0; long totalB = 0l; long totalC = 0l;
    for (Per per : pers) {
        if (per.d != null && !per.d.trim().equals("")) {
            totalA += per.a;
            totalB += per.b;
            totalC += someOperation(per.c);
        }
    }
Run Code Online (Sandbox Code Playgroud)

someOperation 实施并不重要,因为它可能简单或复杂.

如何通过Java8流和lambda表达式实现这一目标?

一个可能的答案是这样的

int totalA = 0; long totalB=0l;
     pers.stream().filter(p->{
         if(p …
Run Code Online (Sandbox Code Playgroud)

lambda field aggregate sum java-8

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

Java 8计算ArrayLists的ArrayList中每个String的重复数

我需要计算每个字符串的出现次数

ArrayList<ArrayList<String>>
Run Code Online (Sandbox Code Playgroud)

我知道如何使用旧的java 7及以下方法,但是想要使用流和收集器来实现它

理想情况下,我会将结果保存在HashMap<String, Integer>,其中integer是多次出现而String是相应的字符串.

反之亦然 - 这不是什么大问题.

我找到了解决方法如何在这里做到这ArrayList 一点

Map<String, Long> counts =
    list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

但我的情况更复杂,因为它是一个ArrayListArrayList秒.

结构如下 String itemId = list.get(i).getProducts().get(j).getItemId();

java-8 java-stream collectors

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

汇总集合的最佳性能方法

假设我有一个名为"城市"的集合(城市类),集合中的每个项目都有一个成员"街道"(街道类),我想迭代所有城市并计算集合中街道的总数.

什么是使用Streams同时避免尽可能多的不必要操作(un\boxing,冗余计算等)的最佳方法

java java-8 java-stream

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