标签: java-stream

是否可以使用Java 8 Streams API进行异步处理?

我一直在Java 8中使用CompletionStage/CompletableFuture来进行异步处理,这非常有效.但是,有时我想要一个阶段来执行迭代器/项目流的异步处理,似乎没有办法做到这一点.

具体来说,Stream.forEach()具有语句,在调用之后所有项都已处理完毕.我想要同样的东西,但改为使用CompletionStage,例如:

CompletionStage<Void> done = stream.forEach(...);
done.thenRun(...);
Run Code Online (Sandbox Code Playgroud)

如果Stream由异步流式传输结果支持,那么比等待它在上面的代码本身中完成要好得多.

是否有可能以某种方式使用当前的Java 8 API构建它?解决方法?

java asynchronous java-8 java-stream

27
推荐指数
2
解决办法
2万
查看次数

如何从迭代器创建Java 8流?

是否可以从迭代器创建一个Stream,其中对象序列与通过重复调用迭代器的next()方法生成的对象序列相同?我想到的具体情况涉及TreeSet.descendingIterator()返回的迭代器的使用,但我可以想象其他情况下迭代器,而不是它引用的集合是可用的.

例如,对于TreeSet<T> tset我们可以tset.stream()...在集合的排序顺序中编写和获取该集合中的对象流,但是如果我们希望它们以不同的顺序(例如通过使用可用的顺序)descendingIterator()怎么办?我想象的东西,tset.descendingIterator().stream()...或者stream( tset.descendingIterator() )...,虽然这些形式都不是有效的.

java java-stream

27
推荐指数
2
解决办法
2万
查看次数

Lambdas,多个forEach与铸造

需要一些帮助思考来自我的同伴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)

java lambda java-8 java-stream

27
推荐指数
2
解决办法
2万
查看次数

Java8 Streams - 删除具有Stream Distinct的重复项

我有一个流如:

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)

java string java-8 java-stream

27
推荐指数
2
解决办法
6万
查看次数

Stream.collect方法中的组合器如何在java 8中工作?

我创建了简单的演示:

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方法中工作?

java java-8 java-stream

27
推荐指数
3
解决办法
6385
查看次数

合并Java 8中的两个对象列表

我有一个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方法吗?

java java-8 java-stream

27
推荐指数
1
解决办法
4万
查看次数

在地图中加入List <String>

我正在尝试将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 java-8 java-stream

27
推荐指数
3
解决办法
1430
查看次数

注册流"完成"钩子

使用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)

java java-8 java-stream

27
推荐指数
3
解决办法
1967
查看次数

如果Map中的所有List值都为空/非空,则使用Streams返回Boolean

给定一个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可以执行相同的首次停止工作("短路"操作),那将是很好的.

java java-stream

27
推荐指数
2
解决办法
4万
查看次数

使用流和 Java 8 的 If/else 表示

我有以下两个实现的接口:

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)

java java-8 java-stream

27
推荐指数
2
解决办法
1455
查看次数

标签 统计

java ×10

java-stream ×10

java-8 ×8

asynchronous ×1

lambda ×1

string ×1