标签: java-8

如何使用无限的java.util.stream.Stream?

说我有一个无限的流:

Stream<Socket> stream = Stream.generate(() -> {
    try {
        return serverSocket.accept();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
});
Run Code Online (Sandbox Code Playgroud)

我希望能够使用它像这样:

stream.forEach(socket -> {
    new Thread(() -> {
        socket.getOutputStream().write("Hi there, client.");
    });
});
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用,这可能是因为我误解了Java 8 Streams的一个关键方面.我究竟做错了什么?

java functional-programming infinite java-8 java-stream

2
推荐指数
1
解决办法
501
查看次数

获取lambdas类的列表

在Java 8中,看起来类的lambda保存在数组中.例如,假设我们有这个类:

public class LambdaFactory {
    public Supplier<Integer> getOne(){
        return () -> 42;
    }

    public Supplier<Integer> getTwo(){
        return () -> 128;
    }

    public Supplier<Integer> getThree(){
         return () -> 3;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我这样打印出来:

    System.out.println(factory.getOne());
    System.out.println(factory.getOne());
    System.out.println(factory.getTwo());
    System.out.println(factory.getThree());
Run Code Online (Sandbox Code Playgroud)

输出将是这样的

examples.LambdaFactory$$Lambda$1@4e515669
examples.LambdaFactory$$Lambda$1@4e515669
examples.LambdaFactory$$Lambda$2@1b9e1916
examples.LambdaFactory$$Lambda$3@ba8a1dc
Run Code Online (Sandbox Code Playgroud)

所以我们在这里可以看到两件事.两次调用的lambda给了我们相同的lambda对象(这与我们每次都可以得到一个新的内部类不同).我们也看到他们看起来像是被保留在某种类型的"Lambda"结构中

我的问题是,我可以在课堂上看到lambdas吗?我没有任何理由这样做,我只是喜欢解剖一些东西

java lambda java-8

2
推荐指数
1
解决办法
1086
查看次数

Java 8函数<T,T>替换

我有

Function<String, String> myFunction;
Run Code Online (Sandbox Code Playgroud)

是否有任何其他预定义的签名表示对象"转换"相同类型的对象的函数?

我相信应该有专门的一个.

谢谢!

java lambda java-8

2
推荐指数
1
解决办法
165
查看次数

在Java 8中找到高低

我正在测试在Java中的列表中搜索低值和高值的不同方法,我意识到使用stream()和parallelStream()方法的结果更慢且性能更差,而不仅仅是遍历列表......

这可能吗?这怎么可能?

这是我的代码:

迭代整个数组:

    private HighLowTuple calculateIteratingWholeArray( List<Integer> arrayWithNumbers,         int from, int to )
        {

    // long start = System.currentTimeMillis();
    HighLowTuple result = new HighLowTuple( -1, Integer.MAX_VALUE );
    for( int i = from; i < to; i++ )
    {

        int value = arrayWithNumbers.get( i );

        if( value > result.high )
        {
            result.high = value;
        }

        if( value < result.low )
        {
            result.low = value;
        }

    }
    // long end = System.currentTimeMillis();
    // System.out.println( "duration internal calculateIteratingWholeArray from " + from …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing list java-8 java-stream

2
推荐指数
1
解决办法
696
查看次数

如何使用ParallelStream将一个数组的每个元素添加到另一个数组的相应元素?

我试图做的可能是使用一个例子更容易解释.我们假设我必须遵循两个数组:

int firstArray[] = {1, 2, 3, 4, 5};
int secArray[] = {1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)

我想要的是将i第二个数组的每个元素添加到i第一个数组的每个元素.当然,创建第三个数组也没关系.

在这个例子中,结果将是: 2, 4, 6, 8, 10

我可以在Java 8中使用ParallelStream以某种方式执行此操作吗?我只能想到使用至少一个索引的解决方案,并且由于并行性(这也违背了目的)它们并不真正起作用.

这种单线程方法有效:

AtomicInteger i = new AtomicInteger(0);
int resultArray[] = Arrays.stream(firstArray)
                          .map(a -> a + secArray[i.getAndIncrement()]).toArray();
Run Code Online (Sandbox Code Playgroud)

但是如果我使用并行流尝试这个,结果(当然它们是)随机的,程序真的很慢.有任何想法吗?

java arrays java-8

2
推荐指数
1
解决办法
402
查看次数

Apache Commons CollectionsUtils.select的Java 8 Lambda替换

我使用Apache Commons lib有以下代码:

public static List<Address> addressesHasType(final List<Address> addresses, final AddressType... types) {
    return (List<Address>) CollectionUtils.select(addresses, new Predicate() {
        @Override
        public boolean evaluate(final Object object) {
            boolean isContains = false;
            for (int i = 0; i < types.length && !isContains; i++) {
                isContains = ((Address) object).getTypes().contains(types[i]);
            }
            return isContains;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我试图重构它只使用没有Apache Commons lib的lambda和Java 8,如下所示:

List<Address> addressList = addresses.stream()
    .filter(a -> a.getTypes().contains(types)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但这份名单最终变得空洞.我尝试使用findFirst()但它不返回List而是返回Optional对象.

addressList2 = addresses.stream()
    .filter(a -> a.getTypes().contains(types)).findFirst();
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

java lambda apache-commons java-8 java-stream

2
推荐指数
1
解决办法
2563
查看次数

当Java8使用引用透明性时

我们注意到java 8使用了参考透明度 :

我测试了很多代码来检测这个RT,例如:

public class ReferentialTransparency {
       public static int triple(int number) {
           System.out.println(number);
           try {
            Thread.sleep(500);
           } catch (Exception e) {

           }
           return number* 3;
        }
        public static void main(String[] args) {
            List<Integer> vals=Arrays.asList(1,2,3,4,3);
            System.out.println(vals.parallelStream()
                    .mapToInt(ReferentialTransparency::triple)
                    .sum());
        }
}
Run Code Online (Sandbox Code Playgroud)

安慰 :

3
4
2
1
3
39
Run Code Online (Sandbox Code Playgroud)

我注意到Java 8运行三重方法,即使有一个元素出现了两次3.

正如Istvan解释的那样,我的问题是:

如果三重引用透明,为什么编译器不会优化重复调用三元组(3)?

java referential-transparency java-8

2
推荐指数
1
解决办法
460
查看次数

如何将流Stream <HashMap <String,Object >>转换为HashMap数组HashMap <String,Object> []?

我是Java 8 Streams的新手.请指教,如何将流转换Stream<HashMap<String, Object>>为HashMap数组HashMap<String, Object>[]

例如,我在代码中有一些流:

Stream<String> previewImagesURLsList = fileNames.stream();

Stream<HashMap<String, Object>> imagesStream = previewImagesURLsList
    .map(new Function<String, HashMap<String, Object>>() {
        @Override
        public HashMap<String, Object> apply(String person) {
            HashMap<String, Object> m = new HashMap<>();
            m.put("dfsd", person);
            return m;
        }
    });
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做

HashMap<String, Object>[] arr = imagesStream.toArray();
Run Code Online (Sandbox Code Playgroud)

抱歉,我的英语不好.

java java-8 java-stream

2
推荐指数
1
解决办法
1664
查看次数

获取(并行)流的状态

有没有办法监控执行resp.在Java 8中收集/减少并行Stream?我想知道,已经处理了多少元素.

在顺序编程中,我可以用for循环完成整个任务并添加一些计数器,我可以不时地打印到stdout,看看需要多长时间.但对于并行流,我没有看到任何简单直接的方法来做同样的事情.

java parallel-processing java-8

2
推荐指数
1
解决办法
157
查看次数

Lambda函数具有无限数量的参数

我试图解决代码中给出的问题.我想要一个能够接受任何函数的lambda表达式

interface ExecuteAnyCode{
    void execute(Object... args);
}

void entry(){
    ExecuteAnyCode a = Math::sin;
    ExecuteAnyCode b = System.out::println;

    a.execute(5);
    b.execute("Hello World")
}
Run Code Online (Sandbox Code Playgroud)

但它让我对传递给功能接口的函数中的参数有误.有没有办法做到这一点?

java lambda interface java-8

2
推荐指数
1
解决办法
159
查看次数