我一直在Java 8中使用CompletionStage/CompletableFuture来进行异步处理,这非常有效.但是,有时我想要一个阶段来执行迭代器/项目流的异步处理,似乎没有办法做到这一点.
具体来说,Stream.forEach()具有语句,在调用之后所有项都已处理完毕.我想要同样的东西,但改为使用CompletionStage,例如:
CompletionStage<Void> done = stream.forEach(...);
done.thenRun(...);
Run Code Online (Sandbox Code Playgroud)
如果Stream由异步流式传输结果支持,那么比等待它在上面的代码本身中完成要好得多.
是否有可能以某种方式使用当前的Java 8 API构建它?解决方法?
是否可以从迭代器创建一个Stream,其中对象序列与通过重复调用迭代器的next()方法生成的对象序列相同?我想到的具体情况涉及TreeSet.descendingIterator()返回的迭代器的使用,但我可以想象其他情况下迭代器,而不是它引用的集合是可用的.
例如,对于TreeSet<T> tset我们可以tset.stream()...在集合的排序顺序中编写和获取该集合中的对象流,但是如果我们希望它们以不同的顺序(例如通过使用可用的顺序)descendingIterator()怎么办?我想象的东西,tset.descendingIterator().stream()...或者stream( tset.descendingIterator() )...,虽然这些形式都不是有效的.
需要一些帮助思考来自我的同伴StackOverflow名人的lambda.
选择列表列表以在图表中深入收集一些孩子的标准情况.什么样的方法可以Lambdas帮助这个样板?
public List<ContextInfo> list() {
final List<ContextInfo> list = new ArrayList<ContextInfo>();
final StandardServer server = getServer();
for (final Service service : server.findServices()) {
if (service.getContainer() instanceof Engine) {
final Engine engine = (Engine) service.getContainer();
for (final Container possibleHost : engine.findChildren()) {
if (possibleHost instanceof Host) {
final Host host = (Host) possibleHost;
for (final Container possibleContext : host.findChildren()) {
if (possibleContext instanceof Context) {
final Context context = (Context) possibleContext;
// copy to another object -- not …Run Code Online (Sandbox Code Playgroud) 我有一个流如:
Arrays.stream(new String[]{"matt", "jason", "michael"});
Run Code Online (Sandbox Code Playgroud)
我想删除以相同字母开头的名称,以便只留下以该字母开头的一个名称(无关紧要).
我试图了解该distinct()方法的工作原理.我在文档中读到它基于对象的"等于"方法.但是,当我尝试包装String时,我注意到从不调用equals方法,也没有删除任何内容.这里有什么我想念的吗?
包装类:
static class Wrp {
String test;
Wrp(String s){
this.test = s;
}
@Override
public boolean equals(Object other){
return this.test.charAt(0) == ((Wrp) other).test.charAt(0);
}
}
Run Code Online (Sandbox Code Playgroud)
还有一些简单的代码:
public static void main(String[] args) {
Arrays.stream(new String[]{"matt", "jason", "michael"})
.map(Wrp::new)
.distinct()
.map(wrp -> wrp.test)
.forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud) 我创建了简单的演示:
public static void main(String[] args) {
List<String> list2 = Arrays.asList("adf", "bcd", "abc", "hgr", "jyt", "edr", "biu");
String collect = list2.stream().collect(String::new, (res, elem) -> {
res=res.concat(" ").concat(elem);
// System.out.printf("res=%s, elem=%s\n", res.isEmpty(), elem);
}, (res1, res2) -> {
System.out.printf("res1=%s, res2=%s\n", res1, res2);
});
System.out.println("collect=" + collect);
}
Run Code Online (Sandbox Code Playgroud)
问题是BiConsumer combiner部分collect根本没有运行.
如果我使用parallelStream()两个参数res1并且res2等于供应商,它就会运行String::new.
如何combiner在collect方法中工作?
我有一个Parent具有20个属性的Java类(attrib1, attrib2 .. attrib20)及其相应的getter和setter.我还有两个Parent对象列表:list1和list2.
现在我想合并两个列表并避免基于attrib1和的重复对象attrib2.
使用Java 8:
List<Parent> result = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是我必须在哪个地方指定属性?我应该覆盖hashCode和equals方法吗?
我正在尝试将a转换Map<String, List<String>>为a Map<String, String>,其中每个键的值是通过连接List上一个映射中的所有值而构建的联合字符串,例如:
A -> ["foo", "bar", "baz"]
B -> ["one", "two", "three"]
Run Code Online (Sandbox Code Playgroud)
应转换为
A -> "foo|bar|baz"
B -> "one|two|three"
Run Code Online (Sandbox Code Playgroud)
使用Java 8 Streams API执行此操作的惯用方法是什么?
使用Java 8 StreamAPI,我想注册一个"完成钩子",类似于:
Stream<String> stream = Stream.of("a", "b", "c");
// additional filters / mappings that I don't control
stream.onComplete((Completion c) -> {
// This is what I'd like to do:
closeResources();
// This might also be useful:
Optional<Throwable> exception = c.exception();
exception.ifPresent(e -> throw new ExceptionWrapper(e));
});
Run Code Online (Sandbox Code Playgroud)
我为什么要那么做的原因是因为我想包装在一个资源Stream的API客户端,消费,我想的是Stream,一旦它被消耗自动清理资源.如果可能,那么客户可以致电:
Collected collectedInOneGo =
Utility.something()
.niceLookingSQLDSL()
.moreDSLFeatures()
.stream()
.filter(a -> true)
.map(c -> c)
.collect(collector);
Run Code Online (Sandbox Code Playgroud)
而不是目前所需要的:
try (Stream<X> meh = Utility.something()
.niceLookingSQLDSL()
.moreDSLFeatures()
.stream()) {
Collected collectedWithUglySyntacticDissonance = …Run Code Online (Sandbox Code Playgroud) 给定一个MapString到a 的映射List,有没有办法使用Java Streams返回一个布尔值,其中TRUE表示一个或多个列表有元素?如果地图中的所有列表都为空,则返回FALSE.
Map< String , List<String> > map = …
Run Code Online (Sandbox Code Playgroud)
可以使用Streams替换这个传统的代码吗?
// See if any diffs were found. Loop through the Map, look at each List of diffs to see if non-empty.
boolean anyElementsInAnyList = false;
for (List<String> list : map.values () ) {
if (!list.isEmpty()) {
anyElementsInAnyList = true;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们可以在第一次发现后突破检查.无需检查所有Map值(所有列表).如果为了效率,Stream可以执行相同的首次停止工作("短路"操作),那将是很好的.
我有以下两个实现的接口:
public interface Parser {
void parse();
boolean canParse(String message);
}
class StackParser implements Parser {
public void parse(){
System.out.println("Parsing stackoverflow");
}
public boolean canParse(String message){
return message.equals("stackoverflow");
}
}
class YoutubeParser implements Parser {
public void parse() {
System.out.println("Parsing youtube");
}
public boolean canParse(String message) {
return message.equals("youtube");
}
}
Run Code Online (Sandbox Code Playgroud)
我去检查传入的消息并解析"stackoverflow"或"youtube":
public class Main {
private List<Parser> parsers;
public static void main(String[] args) {
new Main().doSomething("youtube");
}
void doSomething(String message){
parsers.stream()
.filter(p -> p.canParse(message))
.forEach(p …Run Code Online (Sandbox Code Playgroud)