我有一个for循环,它根据循环对象的值运行不同的方法.普通的旧Java方式是这样的
for(Object obj : inputList){
if(1 == obj.intVar){
executeFirst();
} else if (2 == obj.intVar) {
executeSecond();
} else {
executeDefault();
}
}
Run Code Online (Sandbox Code Playgroud)
或者使用简单的开关盒.
我知道我可以在Java 8中使用类似下面的东西.但对我来说,它似乎是Java 7和8之间的融合.我不确定我是否可以在这里使用filter/map/reduce,因为意图不是数据操作,但要获得特定的行为.我们有什么方法可以用纯Java 8方式做到这一点,还是这样做?
inpultList.stream().forEach(obj -> {
if(1 == obj.intVar){
executeFirst();
} else if (2 == obj.intVar) {
executeSecond();
} else {
executeDefault();
}
});
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我试图填写一张地图,上面有文字及其出现次数.我正在尝试写一个lambda来做它,就像这样:
Consumer<String> wordCount = word -> map.computeIfAbsent(word, (w) -> (new Integer(1) + 1).intValue());
Run Code Online (Sandbox Code Playgroud)
map是Map<String, Integer>.如果它不存在,它应该只是将地图中的单词作为键插入,如果它存在则应该将其整数值增加1.这个语法不正确.
我是java 8编程的新手,想知道使用streams()/ lambda重写下面的最佳方法是什么.
class Person {
String name;
int age;
...
}
public boolean checkPersonAboveAge(List<Person> persons, int age) {
for (Person person : persons) {
if (person.age > age) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我试过:
public boolean checkPersonAboveAge(List<Person> persons, int age) {
Person p = persons.stream().filter(p -> p.age > age).findAny().orElse(null);
if (p != null) {
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我用lamdba读到了代码的可读性会有所提高,但是看看这个例子我要么没有正确使用这个功能,要么缺少一些东西.
拥有如下数据地图:
Map<String, List<Integer>> dataMap = ....
Run Code Online (Sandbox Code Playgroud)
我想将它转换为另一个地图
下面,我试过的解决方案
Map<String, int[]> dataMapOut = new HashMap<>();
dataMap.entrySet().stream().forEach(entry -> {
String key = entry.getKey();
int[] val = entry.getValue().stream().mapToInt(i -> i).toArray();
dataMapOut.put(key, val);
});
Run Code Online (Sandbox Code Playgroud)
寻找更好,更简洁的映射方式?
在通过以下答案讨论在流中使用并发数据结构以及使用并发映射和转换为映射之间的不同之后,有人可以解释如果我使用collectie 的其他语法将会发生什么
Stream<Integer> integers = Stream.iterate(1, n -> n + 1).parallel();
Map<Integer, Boolean> resultMap = integers
.limit(1000)
.collect(HashMap::new,
(map, value) -> map.put(value, false),
HashMap::putAll);
Run Code Online (Sandbox Code Playgroud)
根据文档,将根据生成的线程数调用供应商.如果我使用ConcurrentHashMap而不是HashMap?
当并行执行时,可以实例化,填充和合并多个中间结果,以便保持可变数据结构的隔离.因此,即使与非线程安全数据结构(例如ArrayList)并行执行,也不需要额外的同步来进行并行缩减.
我在我的控制器中有以下代码片段,从第一个列表中我得到了所有用户,然后我迭代向他们发送电子邮件.不知何故,在函数中sendEmail()我不得不返回一个对象,但我不需要返回任何东西.
List<User> users = new ArrayList<User>();
menuPriceSummaryService.findAll()
.stream()
.map (mps -> checkPreferences(mps))
.iterator()
.forEachRemaining(users::addAll);
users
.stream()
.map (o -> sendEmail(o))
.iterator();
Run Code Online (Sandbox Code Playgroud) 基本上我有一个列表,它的元素将逐个处理,直到满足某些条件.如果任何元素满足该条件,则应true以其他方式返回false.该方法如下:
public boolean method(List<Integer> data) {
data.forEach(item -> {
if (some condition is met) {
return true; // Getting Unexpected return value here
}
});
return false;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在条件满足后立即打破这个forEach循环而不是循环遍历所有元素?
我有一个LocalizedAttributes列表
public class LocalizedAttribute<T> {
T value;
Locale locale;
}
Run Code Online (Sandbox Code Playgroud)
我有一个存储本地化属性列表的类;
public class A {
.
.
private List<LocalizedAttribute> localizedAttributes;
}
Run Code Online (Sandbox Code Playgroud)
我有一堂课,里面有一些与书本有关的信息。
public class B {
private String title;
private String summary;
private List<String> authors;
private List<Map<String, String>> publisherRoles;
}
Run Code Online (Sandbox Code Playgroud)
我创造了一堆书
B bookRelatedInfo1 = new B(); ///fill in values;
B bookRelatedInfo2 = new B(); ///fill in values;
B bookRelatedInfo3 = new B(); ///fill in values;
Run Code Online (Sandbox Code Playgroud)
我将此添加到A类的对象中
A.setLocalizedAttributes(ImmutableList.of(
new LocalizedAttribute(bookRelatedInfo1, new Locale("US")),
new LocalizedAttribute(bookRelatedInfo2, new Locale("DE")),
new LocalizedAttribute(bookRelatedInfo3, new Locale("JP"))
)) …Run Code Online (Sandbox Code Playgroud) 我只是在重构一些旧项目以使用Java 8的功能.
int counter = 1;
for (Checker checker : checkers) {
if (counter < checkers.size()) {
checker.setNextChecker(checkers.get(counter++));
}
}
Run Code Online (Sandbox Code Playgroud)
这是一种响应链模式.我需要为列表中的每个检查器设置下一个检查器,不包括最后一个检查器.
还是找不到在这里使用Stream API的方法:)
我有以下代码,我想使用Java 8流API进行翻译.
count = 0;
for (A a : someList) {
if (a.get() == 1) {
count++;
newList.add(new X(count));
}
}
Run Code Online (Sandbox Code Playgroud)
映射时如何计算?
newList = someList.stream
.filter(a -> a.get().equals("red"))
.map(a -> new X(count))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)