使用lambda表达式从ArrayList <E>获取字符串元素

vas*_*v21 1 java lambda java-8

我有一个有效负载返回以下内容ArrayList:

[0] true (boolean)
[1] "someStringValue"
Run Code Online (Sandbox Code Playgroud)

我需要String使用lambda表达式提取包含该值的元素的值.

有任何想法吗?

Zab*_*uza 5

首先请注意,您没有指定ArrayList保留的内容.我会假设它Object.如果它是一些容器类,那么你需要在这里和那里调整代码.应该比较容易.如果您遇到困难,请不要打扰评论并提供其他信息.

没有Java 8

让我们先看看如何在没有Streams或Lambda的情况下完成它:

ArrayList<Object> list = ...

List<String> result = new ArrayList<>();
// Iterate all elements
for (Object obj : list) {
    // Ignore elements that are not of type String
    if (!(obj instanceof String)) {
        continue;
    }

    // The element is String, cast it
    String objAsText = (String) obj;
    // Collect it
    result.add(objAsText);
}
Run Code Online (Sandbox Code Playgroud)

该列表result现在只包含原始列表,它的元素的真实类型String.


使用Java 8(Streams,Lambdas,方法引用)

我们现在可以使用Stream API轻松编写等效版本.请注意,您可能Stream通常将s与Lambda 混淆(它们是不同的技术,但Lambda通常在Stream-API中使用).

ArrayList<Object> list = ...

result = list.stream()                // Stream<Object>
    .filter(String.class::isInstance) // Stream<Object>
    .map(String.class::cast)          // Stream<String>
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

就是这样,非常简单易读.的Collection#stream(文档)返回一个Stream由给定集合中的元素.的Stream#filter(文档)方法返回一个Stream其中不匹配的条件的元素被跳过.的Stream#map(文档)变换一个Stream<X>Stream<Y>通过应用给定的方法对所有对象(X可以等于Y).最后,Stream#collect(documentation)方法通过使用给定的方法收集所有元素Collector.

如果您真的想要使用Lambdas,那么这可能更符合您的要求:

ArrayList<Object> list = ...
List<String> result = new ArrayList<>();

list.forEach(obj -> {    // This is a big lambda
    // Ignore elements that are not of type String
    if (!(obj instanceof String)) {
        return;
    }

    // The element is String, cast it
    String objAsText = (String) obj;
    // Collect it
    result.add(objAsText);
});
Run Code Online (Sandbox Code Playgroud)

但我真的认为你在这里混淆了这些术语.