通读这篇文章,我可以像这样过滤集合:
Set<Status> statusClone = cloner.deepClone(statusList).stream().filter(s -> !(s instanceof FileMetadata)).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
但是,我还需要设置属性同时过滤它们.过滤后,我目前遍历每个,然后设置属性:
for (Iterator<Status> iterator = statusClone.iterator(); iterator.hasNext();)
{
Status s = iterator.next();
// if (s instanceof FileMetadata)
// {
// iterator.remove();
// continue;
// }
s.setStatus(JobStatus.UNINITIATED);
s.setLastAccessedTime(0);
s.setOffSet(null);
s.setStreamNo(null);
}
statusList.addAll(statusClone);
Run Code Online (Sandbox Code Playgroud)
如果不使用foreach,这在Java8中是否可行?
编辑:从评论,我同意我可以在过滤器内克隆.谢谢.
我正在学习java 8流,有些问题对我而言.
假设这段代码:
new Random().ints().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
它在某种程度上内部称IntPipeline,我认为有责任无限期地生成这些内容.通过查看java源代码很难理解Streams实现.
您能否给出一个简短的解释,或者给出一些关于如何生成流以及如何连接管道操作的好/易理解的材料.整数上面的代码示例是随机生成的,如何建立这种连接?
我上课了
class Person {
String name;
....
Optional<Integer> children;
}
Run Code Online (Sandbox Code Playgroud)
如何使用流来获取所有孩子的总数?
public int totalCount(final Set<Person> people) {
int total = 0;
for (Person person : people) {
if (person.getChildren().isPresent()) {
total += person.getChildren().get();
}
}
return total;
}
Run Code Online (Sandbox Code Playgroud)
如何使用Java 8流做到这一点?
public int totalCount(final Set<Person> people) {
int total = 0;
people.stream()
.filter(p -> p.getChildren().isPresent())
// ???
}
Run Code Online (Sandbox Code Playgroud) 我有一个CSV文件,第一行有一个标题.我想将其转换为List<Map<String, String>>,其中Map<String, String>列表中的每个代表文件中的记录.地图的关键是标题,值是字段的实际值.到目前为止我所拥有的:
BufferedReader br = <handle to file>;
// Get the headers to build the map.
String[] headers = br.lines().limit(1).collect(Collectors.toArray(size -> new String[size]));
Stream<String> recordStream = br.lines().skip(1);
Run Code Online (Sandbox Code Playgroud)
我可以执行哪些进一步操作recordStream以便将其转换为List<Map<String, String>>?
示例CSV文件是:
header1,header2,header3 ---- Header line
field11,field12,field13 ----> need to transform to Map where entry would be like header1:field11 header2:field12 and so on.
field21,field22,field23
field31,field32,field33
Run Code Online (Sandbox Code Playgroud)
最后,需要将所有这些地图收集到列表中.
是否可以仅使用元素索引从另一个列表创建子列表?我正在寻找一个很好的解决方案,例如lambdas,来自Java 8的流.
例如(伪代码):
a = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
b = a.getByIndices([0, 2, 4, 5, 3])
print(b) // [10, 8, 6, 5, 7]
Run Code Online (Sandbox Code Playgroud) 下面是我的String列表.
["sunday", "monday", "tuesday", "wednesday", "fri", "satur"]
Run Code Online (Sandbox Code Playgroud)
我想要做删除"天"从元素;如果它与"天"的结局.如何在Lambda中做到这一点?
列表中的预期输出:
["sun", "mon", "tues", "wednes", "fri", "satur"]
Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码,但无法将值分配给列表
daysList.stream().forEach(s -> { if(s.endsWith("day")) {
s = s.substring(0, s.indexOf("day"));
}});
Run Code Online (Sandbox Code Playgroud)
有人可以帮我这个吗?
我发现的所有示例都使用其他类型信息来推断其类型Stream.empty().似乎应该有语法允许我直接投射它.这个例子有效:
import java.util.*;
import java.util.stream.*;
class OptionalBasics {
static void test(Optional<String> optString) {
if(optString.isPresent())
System.out.println(optString.get());
else
System.out.println("Nothing inside!");
}
public static void main(String[] args) {
Stream<String> s = Stream.empty();
test(s.findFirst());
test(Stream.of("Epithets").findFirst());
}
}
/* Output:
Nothing inside!
Epithets
*/
Run Code Online (Sandbox Code Playgroud)
但请注意,我必须s单独创建才能提供类型信息Stream.empty().我想在调用中创建它
test(),就像这样(这不起作用):
test(Stream<String>.empty().findFirst());
Run Code Online (Sandbox Code Playgroud)
是否有用于设置调用类型的语法Stream.empty()?
我希望根据某些条件从列表中获取最小或最大项目.下面的摘录总结了我在做什么:
Optional<Person> target;
if(condition){
target = detailedList.stream().min((d1, d2) -> d1.age() + d2.age());
} else {
target = detailedList.stream().max((d1, d2) -> d1.age() + d2.age());
}
Run Code Online (Sandbox Code Playgroud)
它有效,但相当冗长.本质上,我想在流中选择方法min或max.有一个更好的方法吗?
鉴于一堆具有int size()方法和get(int i)方法的东西,它如何最容易流式传输?
import nu.xom.Builder;
import nu.xom.Element;
import nu.xom.Elements;
// My builder.
Builder builder = new Builder();
class Thing {
public Thing(Element from) {
// Construct from an Element.
}
}
private Stream<Thing> allThings(Path path) throws FileNotFoundException, ParsingException, IOException {
Elements things = builder.build(new FileInputStream(path.toFile()))
.getRootElement().getChildElements();
// Return a stream of `Thing`s created from all of the children.
// How??
}
Run Code Online (Sandbox Code Playgroud)
我的尝试使用了一所旧式学校,Iterable并且流式传输似乎不必要的杂乱.
我有一个: List<Map<String, Long>> items = new ArrayList<>();
我想得到一个Map,其中键被分组,值是总和.
示例:列表
结果:地图
我知道如何以"长"方式执行此操作,但尝试使用java 8功能发现lambda/streaming/groupby方法.有什么想法吗?