使用lambda表达式

时间:2017-11-30 18:09:49

标签: java lambda java-8

我有一个有效负载,返回以下ArrayList

[0] true (boolean)
[1] "someStringValue"

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

有什么想法吗?

4 个答案:

答案 0 :(得分: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);
}

列表result现在只包含原始列表中 true type String的元素。

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

我们现在可以使用Stream API轻松编写等效版本。请注意,您可能会将Stream与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());

这就是它,非常简单易读。 Collection#streamdocumentation)返回由给定集合中的元素组成的StreamStream#filterdocumentation)方法返回Stream,其中跳过与条件不匹配的元素。通过将给定方法应用于所有对象,Stream#mapdocumentation)将Stream<X>转换为Stream<Y>X可以等于Y) 。最后,Stream#collectdocumentation)方法使用给定的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);
});

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

答案 1 :(得分:2)

如果您想将此作为lambda,您可以执行以下操作:

假设你有一个如下的集合:

Notifications

答案 2 :(得分:1)

使用instanceof和lambda表达式:

ArrayList<Object> array = new ArrayList<Object>();

array.add(new Boolean(true));
array.add(new String("someStringValue"));


array.forEach(item->{
    if(item instanceof String){
        System.out.println(item);
    }
});

Working example

答案 3 :(得分:1)

您好,这是我的建议:

class SimplePlayer : public QMainWindow
{
     Q_OBJECT

    public:
    SimplePlayer(QWidget *parent = 0);
    ~SimplePlayer();

    private:
    Ui::SimplePlayer *ui;
    VlcInstance *_instance;
    VlcMedia *_media;
    VlcMediaPlayer *_player;
    //QLabel *_lbl;//  if I declare a very simple Qlabel the app crashes

    private slots:
    void openLocal();
    void openUrl();
 };

希望这有帮助!