标签: java-stream

Java 8对静态方法与实例方法的引用

说我有以下代码

public class A {
    int x;
    public boolean is() {return x%2==0;}
    public static boolean is (A a) {return !a.is();}
}
Run Code Online (Sandbox Code Playgroud)

而在另一堂课......

List<A> a = ...
a.stream().filter(b->b.isCool());
a.stream().filter(A::is); 
//would be equivalent if the static method is(A a) did not exist
Run Code Online (Sandbox Code Playgroud)

问题是如何使用A :: is类型表示法引用实例方法版本?非常感谢

java java-8 java-stream method-reference

11
推荐指数
1
解决办法
7225
查看次数

标准集合返回的Stream实现有多专业?

Stream是一个接口,所以每当有人抓住一个Stream对象时,隐藏了许多特定于实现的细节.

例如,请使用以下代码:

List<String> list = new ArrayList<>();
...
int size = list.stream()
               .count();
Run Code Online (Sandbox Code Playgroud)

它是在恒定时间还是线性时间运行?或这个:

Set<String> set = new TreeSet<>();
...
set.stream()
   .sorted()
   .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

那是O(n)还是O(n log n)?

一般来说,标准集合返回的流实现有多专业?

java java-8 java-stream

11
推荐指数
1
解决办法
676
查看次数

限制Kotlin的功能

limitJava 8中有一个stream方法:

package com.concretepage.util.stream;
import java.util.Arrays;
import java.util.List;
public class LimitDemo {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("AA","BB","CC","DD","EE");    
        list.stream().limit(3).forEach(s->System.out.println(s));
    }        
} 
Run Code Online (Sandbox Code Playgroud)

输出:

AA
BB
CC 
Run Code Online (Sandbox Code Playgroud)

Kotlin中的模拟名称是什么,或者如何通过其他方式更好地做到这一点?

java-8 kotlin java-stream

11
推荐指数
1
解决办法
3417
查看次数

使用Java 8合并两个映射

我有两张这样的地图:

map1 = new Map<String, MyObject>();
map2 = new Map<String, MyObject>();

MyObject {
   Integer mark1;
   Integer mark2;
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是将两个地图合并成map3 <String, MyObject>如下:

  1. 如果map1.place不在map2.place,那么我将条目添加到map3.
  2. 同样如果map2.place不在map1.place,我添加条目map3.
  3. 如果map1.place是map2.place,那么我添加此条目:
    • map1.place, (map1.mark1, map2.mark2)

我已经读过了flatMap,但我真的很难用它.有任何线索如何做到这一点?
谢谢!!

java java-stream

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

为什么没有IntStream.flatMapToObj()?

我正在尝试做这样的事情:

Stream<Object> stream = IntStream.of(...)
        .flatMapToObj(i -> getStreamOfObjects(i));
Run Code Online (Sandbox Code Playgroud)

不幸的是,IntStream.flatMapToObj()即使在Java 9中也不存在.

  1. 为什么遗漏了?
  2. 什么是推荐的解决方法?

java java-8 java-stream

11
推荐指数
3
解决办法
1123
查看次数

Java Streams:filter().count()vs anyMatch()

我想找出一个字符串流是否至少有一个出现在另一个字符串String中Set<String>.我想出了两个解决方案.

性能方面,哪种方法最好/推荐?

1)

return source.stream().filter(this::streamFilter).count() > 0;
Run Code Online (Sandbox Code Playgroud)

2)

return source.stream().anyMatch(this::streamFilter);
Run Code Online (Sandbox Code Playgroud)

这是streamFilter方法:

private boolean streamFilter(String str) {
    return filterKeywords.contains(str.toLowerCase());
}
Run Code Online (Sandbox Code Playgroud)

filterKeywords: private Set<String> filterKeywords;

或者有更好的方法吗?

java java-8 java-stream

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

Java 8使用参数流映射

我有这几个函数,我想知道是否可以将参数传递deviceEvent.hasAlarm()给.map(this::sendSMS)

private void processAlarm (DeviceEvent deviceEvent)  {

        notificationsWithGuardians.stream()
                    .filter (notification -> notification.getLevels().contains(deviceEvent.getDeviceMessage().getLevel()))
                    .map(this::sendSMS)
                    .map(this::sendEmail);

    }

    private DeviceAlarmNotification sendSMS (DeviceAlarmNotification notification, DeviceEvent deviceEvent)  {

        if (deviceEvent.hasAlarm()) {       

        }

        return notification;

    }
Run Code Online (Sandbox Code Playgroud)

java lambda functional-programming java-8 java-stream

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

flatMap是否保证是懒惰的?

请考虑以下代码:

urls.stream()
    .flatMap(url -> fetchDataFromInternet(url).stream())
    .filter(...)
    .findFirst()
    .get();
Run Code Online (Sandbox Code Playgroud)

fetchDataFromInternet当第一个足够的时候会被叫第二个网址吗?

我尝试了一个较小的例子,看起来像预期的那样工作.即逐个处理数据但是可以依赖这种行为吗?如果没有,请.sequential()在.flatMap(...)帮助前打电话吗?

    Stream.of("one", "two", "three")
            .flatMap(num -> {
                System.out.println("Processing " + num);
                // return FetchFromInternetForNum(num).data().stream();
                return Stream.of(num);
            })
            .peek(num -> System.out.println("Peek before filter: "+ num))
            .filter(num -> num.length() > 0)
            .peek(num -> System.out.println("Peek after filter: "+ num))
            .forEach(num -> {
                System.out.println("Done " + num);
            });
Run Code Online (Sandbox Code Playgroud)

输出:

Processing one
Peek before filter: one
Peek after filter: one
Done one
Processing two
Peek before filter: two
Peek after filter: …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream flatmap

11
推荐指数
2
解决办法
1304
查看次数

创建自定义交替数字流

如何IntStream在给定的顺序范围的中间开始,然后从中间开始流式传输下一个数字,并交替向左和向右.例如,对于数字的顺序给出的范围1 2 3 4 5,自定义序列会3 2 4 1 5或3 4 2 5 1取决于是否先从左边或右边第一.

我基本上试图从中间开始迭代一个数组并向外均匀地向外(不要先完​​全向左或向右).

我曾经尝试这样做只使用for循环但代码是凌乱的,我认为这将是多好,只是排队的不是检查它的飞行(因为所有指数指出,有界异常的数字集合或流待检查).这是原始代码,我认为作为预先计算的int流更好:

        int middle = myArray.length / 2;
        Object value = myArray[middle]; //have to reference middle since the for loop won't
        //do operation on value
        for (int offset = 1; true; offset++) {
            int nextRight = middle + offset;
            int nextLeft = middle - offset;
            if (nextRight < myArray.length) { // Have to guard against …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

11
推荐指数
2
解决办法
433
查看次数

用方法引用替换此lambda

我有以下代码.Sonar抱怨用方法参考替换这个lambda.

Stream.iterate(0, i -> i + 1).limit(100).map(i -> Integer.toString(i));
Run Code Online (Sandbox Code Playgroud)

如果我用下面的代码替换它,它不会编译与编译错误:类型不匹配:无法转换Stream<Object>为<unknown>.

Stream.iterate(0, i -> i + 1).limit(100).map(Integer::toString);
Run Code Online (Sandbox Code Playgroud)

如何Integer::toString转换Stream<Object>到<unknown>?

java java-8 java-stream sonarqube

11
推荐指数
2
解决办法
2188
查看次数