我想用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)
有没有更好的方法来转换它?
我有这个代码:
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)
如果在遍历此地图时会发生什么 - 有人会在其中添加新值或从中删除现有值?
我试过了:
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()传递编译?
我基本上想做的事情如下:
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)
这是一个例子,我不需要得到如何解决这个特定问题的答案,这只是一个例子来展示我正在追求的奇特东西.
我有这样的旧式代码:
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>>
我很简单
class Per{
int a;
long b;
double c;
String d;
}
Run Code Online (Sandbox Code Playgroud)
假设我有3000个类型的对象Per并收集在一个List<Per> pers
现在我想实现: -
d为null或blankabc老路是
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) 我需要计算每个字符串的出现次数
ArrayList<ArrayList<String>>
Run Code Online (Sandbox Code Playgroud)
我知道如何使用旧的java 7及以下方法,但是想要使用流和收集器来实现它
理想情况下,我会将结果保存在HashMap<String, Integer>,其中integer是多次出现而String是相应的字符串.
反之亦然 - 这不是什么大问题.
Map<String, Long> counts =
list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)
但我的情况更复杂,因为它是一个ArrayList的ArrayList秒.
结构如下
String itemId = list.get(i).getProducts().get(j).getItemId();
假设我有一个名为"城市"的集合(城市类),集合中的每个项目都有一个成员"街道"(街道类),我想迭代所有城市并计算集合中街道的总数.
什么是使用Streams同时避免尽可能多的不必要操作(un\boxing,冗余计算等)的最佳方法
java-8 ×10
java ×8
java-stream ×8
lambda ×3
aggregate ×1
collections ×1
collectors ×1
concurrency ×1
field ×1
generics ×1
sum ×1