小编Ous*_* D.的帖子

Java 8列表处理 - 有条件地添加元素

我有以下代码:

List<Object> list = new ArrayList<>();
list.addAll(method1());
if(list.isEmpty()) { list.addAll(method2()); }
if(list.isEmpty()) { list.addAll(method3()); }
if(list.isEmpty()) { list.addAll(method4()); }
if(list.isEmpty()) { list.addAll(method5()); }
if(list.isEmpty()) { list.addAll(method6()); }
return list;
Run Code Online (Sandbox Code Playgroud)

是否有一种很好的方式有条件地添加元素,可能使用流操作?我想只在列表为空时添加来自method2的元素,否则返回等等.

编辑:值得一提的是,这些方法包含大量逻辑,因此需要防止执行.

java collections java-8 java-stream

51
推荐指数
5
解决办法
2012
查看次数

将对象属性列表加入String

我现在正在学习lambda,我想知道如何用lambda一行编写这段代码.

我有一个Person包括IDname字段的类

目前,我有一个List<Person>存储这些Person对象.我想要完成的是获取一个由人的id组成的字符串.

"id1,id2,id3".

我怎样才能用lambda实现这个目标?

java lambda java-8 java-stream

23
推荐指数
2
解决办法
7452
查看次数

使用过滤器和流将Map <String,Object>转换为Map <String,Set <Object >>

我想转换我看起来像这样的地图:

{
  key="someKey1", value=Apple(id="1", color="green"),
  key="someKey2", value=Apple(id="2", color="red"),
  key="someKey3", value=Apple(id="3", color="green"),
  key="someKey4", value=Apple(id="4", color="red"),
}
Run Code Online (Sandbox Code Playgroud)

到另一个地图,将所有相同颜色的苹果放入同一个列表中:

{
  key="red", value=list={apple1, apple3},
  key="green", value=list={apple2, apple4},  
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

Map<String, Set<Apple>> sortedApples = appleMap.entrySet()
    .stream()
    .collect(Collectors.toMap(l -> l.getColour, ???));
Run Code Online (Sandbox Code Playgroud)

我是在正确的轨道上吗?我应该使用过滤器来执行此任务吗?有没有更简单的方法?

java lambda java-8 java-stream

20
推荐指数
3
解决办法
1122
查看次数

仅当字符串不为null或为空时才附加逗号

我在C#中创建简单的webform.在这里,我通过连接哪个效果很好来获得完整的地址.但是,让我们说,如果我没有address2,city等等,那么我想在每一个字符串的结尾跳过附加逗号(例如,如果address1为空或空).

string address1 = "Address1";
string address2 = "Address2";
string city = "City";
string country = "Country";
string postalCode = "00000";

string fullAddress = ? --> address1 + ","+ address2 +","+ city  and so on
Run Code Online (Sandbox Code Playgroud)

c#

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

Java8中Iterator和Spliterator的区别

我在学习的过程中认识到这Parallelism是一个主要优势Spliterator.

这可能是一个基本的问题,但任何人都可以解释我的主要差异Iterator,并Spliterator和举一些例子?

parallel-processing iterator java-8 spliterator

13
推荐指数
2
解决办法
5417
查看次数

为什么Java中没有实例级的Stream.concat方法?

我知道Stream.concat存在(doc)来连接两个流.但是,我遇到了需要在现有流中添加"更多"项目,然后继续处理它的情况.在这种情况下,我本来希望能够将以下方法联系在一起:

getStream(someArg)
  .map(Arg::getFoo)
  .concat(someOtherStreamOfFoos) // Or append, or...
  .map(...)
Run Code Online (Sandbox Code Playgroud)

但是,不存在这种实例级可链接append/concat方法.

这不是一个问题,要求解决这个问题,或更优雅的方法(虽然我当然会感激任何其他观点!).相反,我问的是导致这一决定的设计因素.我相信,Stream界面是由一些非常聪明的人设计的,他们都知道最小惊讶原则 - 所以,我必须假设他们决定省略这个(对我来说)直观明显的方法,这意味着该方法是一个反模式,或由于某些技术限制而无法实现.我很想知道原因.

java java-8 java-stream

12
推荐指数
1
解决办法
292
查看次数

如何使用java 8处理可空列表?

我正在进行服务电话并尝试处理响应.响应可能有一个列表.该列表可能为null.

此外,如果列表不为null或不为空,则需要对其进行过滤.在代码"entry"中,如果过滤不提供任何内容或响应列表为空或null,则引用可能为null.

目前,当我尝试在空响应列表上使用stream()时,我正在获取NPE.我该如何处理这种情况?

@Getter
public class ServiceResponse {  
    List<ResponseEntry> entryList;
}

@Getter
public class ResponseEntry {
    String value;
}


ServiceResponse serviceResponse = service.getServiceResponse();
ResponseEntry entry = serviceResponse.getEntryList()
    .stream()
    .filter(e -> "expectedValue".equals(e.getValue()))
    .findFirst()
    .orElse(null);

if (entry == null) { ... }
Run Code Online (Sandbox Code Playgroud)

java optional java-8 java-stream

12
推荐指数
4
解决办法
1855
查看次数

从长变量中获取第二个数字

我试图从一个长变量中获取第二个数字.

long mi = 110000000;
int firstDigit = 0;
String numStr = Long.toString(mi);
for (int i = 0; i < numStr.length(); i++) {
    System.out.println("" + i + " " + numStr.charAt(i));
    firstDigit =  numStr.charAt(1);
}
Run Code Online (Sandbox Code Playgroud)

当我firstDigit = numStr.charAt(1)在控制台上打印时.我得到1预计但当循环结束firstDigit49.有点困惑为什么.

java long-integer

10
推荐指数
3
解决办法
1226
查看次数

Java8:Stream在同一个流中映射两个属性

我有一个Model具有以下签名的课程:

class Model {
        private String stringA;
        private String stringB;

        public Model(String stringA, String stringB) {
            this.stringA = stringA;
            this.stringB = stringB;
        }

        public String getStringA() {
            return stringA;
        }

        public String getStringB() {
            return stringB;
        }
}
Run Code Online (Sandbox Code Playgroud)

我想将a映射List<Model>List<String>包含stringA和stringB的单个流中

List<String> strings = models.stream()
                .mapFirst(Model::getStringA)
                .thenMap(Model::getStringB)
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

要么:

List<String> strings = models.stream()
                .map(Mapping.and(Model::getStringA,Model::getStringB))
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

当然,他们都没有编译,但你明白了.

它有可能吗?

编辑:

例:

Model ab = new Model("A","B");
Model cd = new Model("C","D");
List<String> stringsFromModels = {"A","B","C","D"};
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

10
推荐指数
2
解决办法
5081
查看次数

使用Java 8在列表中仅查找重复的String属性

我知道下面是查找列表中每个字符串属性的出现的代码,如何仅使用重复项过滤此列表,即出现多于1次.对不起,我是java 8的新手.

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

java java-8 java-stream

10
推荐指数
2
解决办法
1762
查看次数