英文:
How save a native variable with streams
问题
以下是您要翻译的内容:
嗨,我正在尝试理解Java 8的API流(streams),我不知道是否可以实现,但我试图对列表进行过滤,并将其保存在一个新变量中,就像这样。编译器告诉我它无法将Stream<String>转换为String,这是有道理的,但是我该如何执行这个操作呢?
List<String> lista = new ArrayList<String>();
lista.add("1");
lista.add("2");
String num = lista.stream().filter(x -> x.equals("1"));
如果我想将那个字符串转换为整数,我尝试执行这个操作,但编译器同样告诉我,类型错误:
List<String> lista = new ArrayList<String>();
lista.add("1");
lista.add("2");
int num = lista.stream().filter(x -> x.equals("1")).map(x -> Integer.parseInt(x));
英文:
Hi im trying to understand java 8 api streams, i dont know if this can be done, but im trying to do a filter to a list a save in a new variable like this and the compiler say to me that he cant convert from Stream<String> to String and it has sense but how can i do the operation?
List<String> lista = new ArrayList<String>();
lista.add("1");
lista.add("2");
String num = lista.stream().filter(x -> x.equals("1"));
And if i want to convert that string to int i try to do this but also the compiler say to me, wrong types
List<String> lista = new ArrayList<String>();
lista.add("1");
lista.add("2");
int num = lista.stream().filter(x -> x.equals("1")).map(x -> Integer.parseInt(x));
答案1
得分: 0
你只缺少一次对 findFirst
的调用:
String num = lista.stream().filter(x -> x.equals("1")).findFirst().get();
还有针对 Map
的部分:
int num = lista.stream().filter(x -> x.equals("1")).map(x -> Integer.parseInt(x)).findFirst().get();
在使用 Optional
的 get
方法时要小心,如果过滤器没有返回任何内容,它会抛出 NoSuchElementException
异常。
英文:
You are missing just one call to findFirst
:
String num = lista.stream().filter(x -> x.equals("1")).findFirst().get();
And also for the Map
:
int num = lista.stream().filter(x -> x.equals("1")).map(x -> Integer.parseInt(x)).findFirst().get();
Be careful when using get
method of Optional
, if the filter returns nothing it will throw NoSuchElementException
.
答案2
得分: 0
流在给定终端方法之前不会开始处理。因此,请尝试以下代码:
List<String> lista = new ArrayList<String>();
lista.add("1");
lista.add("2");
int num = lista.stream().filter(x -> x.equals("1"))
.mapToInt(Integer::parseInt) // 在这里使用方法引用。
.findFirst().orElse(0);
findFirst
返回一个 OptionalInt
,因此如果未找到任何内容,您需要有一个默认值进行返回。 orElse
完成这个操作。还要使用 mapToInt
,因为 Integer::parseInt
返回一个 int
。这样可以避免不必要的装箱。当您不需要解析 int 时,可以将类似的技术应用于仅获取 String。
英文:
Streams don't start processing until a terminal method is given to start it. So try this:
List<String> lista = new ArrayList<String>();
lista.add("1");
lista.add("2");
int num = lista.stream().filter(x -> x.equals("1"))
.mapToInt(Integer::parseInt) // use method reference here.
.findFirst().orElse(0);
findFirst
returns an OptionalInt
so you need to have a default value to return if nothing is found. orElse
does that. Also use mapToInt
since Integer::parseInt
returns an int
. Avoids unnecessary boxing. You can apply a similar technique to just get the String when you don't need to parse an int.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论