标签: java-8

循环内的条件操作,java 8方式

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

提前致谢.

java java-8

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

Lambda填充Map

我试图填写一张地图,上面有文字及其出现次数.我正在尝试写一个lambda来做它,就像这样:

Consumer<String> wordCount = word -> map.computeIfAbsent(word, (w) -> (new Integer(1) + 1).intValue());
Run Code Online (Sandbox Code Playgroud)

mapMap<String, Integer>.如果它不存在,它应该只是将地图中的单词作为键插入,如果它存在则应该将其整数值增加1.这个语法不正确.

java collections dictionary java-8

2
推荐指数
1
解决办法
96
查看次数

java 8如何使用集合流来检查对象的存在

我是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读到了代码的可读性会有所提高,但是看看这个例子我要么没有正确使用这个功能,要么缺少一些东西.

collections java-8

2
推荐指数
1
解决办法
326
查看次数

将Map <String,List <Integer >>转换为Map <String,int []>

拥有如下数据地图:

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)

寻找更好,更简洁的映射方式?

java lambda java-8

2
推荐指数
1
解决办法
120
查看次数

使用collect时的并发数据结构和并行流

在通过以下答案讨论在流中使用并发数据结构以及使用并发映射和转换为映射之间的不同之后,有人可以解释如果我使用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)并行执行,也不需要额外的同步来进行并行缩减.

lambda java-8 java-stream

2
推荐指数
1
解决办法
151
查看次数

Java8列表.调用void函数

我在我的控制器中有以下代码片段,从第一个列表中我得到了所有用户,然后我迭代向他们发送电子邮件.不知何故,在函数中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)

java collections lambda java-8 java-stream

2
推荐指数
1
解决办法
252
查看次数

java - 如何使用lambda表达式从forEach方法中断

基本上我有一个列表,它的元素将逐个处理,直到满足某些条件.如果任何元素满足该条件,则应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循环而不是循环遍历所有元素?

java foreach lambda java-8

2
推荐指数
1
解决办法
2933
查看次数

将字段名称/类型作为参数传递给Java中的方法

我有一个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 oop design-patterns java-8

2
推荐指数
1
解决办法
464
查看次数

用lambda表达式替换for-each循环

我只是在重构一些旧项目以使用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 foreach java-8 java-stream

2
推荐指数
1
解决办法
1114
查看次数

收集后在java8上获取索引

我有以下代码,我想使用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)

lambda java-8 java-stream

2
推荐指数
1
解决办法
76
查看次数