如何使用流保存本地变量

huangapple go评论87阅读模式
英文:

How save a native variable with streams

问题

以下是您要翻译的内容:

嗨,我正在尝试理解Java 8的API流(streams),我不知道是否可以实现,但我试图对列表进行过滤,并将其保存在一个新变量中,就像这样。编译器告诉我它无法将Stream<String>转换为String,这是有道理的,但是我该如何执行这个操作呢?

List&lt;String&gt; lista = new ArrayList&lt;String&gt;();
lista.add("1");
lista.add("2");

String num = lista.stream().filter(x -> x.equals("1"));

如果我想将那个字符串转换为整数,我尝试执行这个操作,但编译器同样告诉我,类型错误:

List&lt;String&gt; lista = new ArrayList&lt;String&gt;();
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&lt;String&gt; lista = new ArrayList&lt;String&gt;();
    lista.add(&quot;1&quot;);
    lista.add(&quot;2&quot;);
    
    String num = lista.stream().filter(x -&gt; x.equals(&quot;1&quot;));

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&lt;String&gt; lista = new ArrayList&lt;String&gt;();
    lista.add(&quot;1&quot;);
    lista.add(&quot;2&quot;);
    
    int num = lista.stream().filter(x -&gt; x.equals(&quot;1&quot;)).map(x -&gt; 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();

在使用 Optionalget 方法时要小心,如果过滤器没有返回任何内容,它会抛出 NoSuchElementException 异常。

英文:

You are missing just one call to findFirst:

String num = lista.stream().filter(x -&gt; x.equals(&quot;1&quot;)).findFirst().get();

And also for the Map:

int num = lista.stream().filter(x -&gt; x.equals(&quot;1&quot;)).map(x -&gt; 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&lt;String&gt; lista = new ArrayList&lt;String&gt;();
    lista.add(&quot;1&quot;);
    lista.add(&quot;2&quot;);
    
    int num = lista.stream().filter(x -&gt; x.equals(&quot;1&quot;))
             .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.

huangapple
  • 本文由 发表于 2020年10月8日 06:40:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/64253299.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定