我有一个有效负载,返回以下ArrayList
:
[0] true (boolean)
[1] "someStringValue"
我需要使用 lambda表达式提取包含String
值的元素的值。
有什么想法吗?
答案 0 :(得分:5)
首先请注意,您没有指定ArrayList
持有的内容。我会假设它是Object
。如果它是一些容器类,那么你需要在这里和那里调整代码。应该比较容易。如果您遇到困难,请不要发表评论并提供更多信息。
让我们先看看如何在没有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
的元素。
我们现在可以使用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#stream
(documentation)返回由给定集合中的元素组成的Stream
。 Stream#filter
(documentation)方法返回Stream
,其中跳过与条件不匹配的元素。通过将给定方法应用于所有对象,Stream#map
(documentation)将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);
});
但我真的认为你在这里混淆了这些术语。
答案 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);
}
});
答案 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();
};
希望这有帮助!