vas*_*v21 1 java lambda java-8
我有一个有效负载返回以下内容ArrayList:
[0] true (boolean)
[1] "someStringValue"
Run Code Online (Sandbox Code Playgroud)
我需要String使用lambda表达式提取包含该值的元素的值.
有任何想法吗?
首先请注意,您没有指定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);
}
Run Code Online (Sandbox Code Playgroud)
该列表result现在只包含原始列表,它的元素的真实类型是String.
我们现在可以使用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)
但我真的认为你在这里混淆了这些术语.
| 归档时间: |
|
| 查看次数: |
4175 次 |
| 最近记录: |