小编Ste*_*bel的帖子

BigDecimal #min方法是否有资格作为BinaryOperator?

Stream.reduce方法以a BinaryOperator为参数.a的函数签名BinaryOperator(T,T) -> T.该BigDecimal::min方法在其方法签名中只有1个参数(即.(T) -> T).

当我传递BigDecimal::minStream.reduce方法时,为什么编译器不会抱怨?

示例代码:

List<BigDecimal> bigDecimalList = new ArrayList<>();
        bigDecimalList.add(BigDecimal.valueOf(1));
        bigDecimalList.add(BigDecimal.valueOf(2));
        bigDecimalList.add(BigDecimal.valueOf(3));
BigDecimal minResult = bigDecimalList.stream().reduce(BigDecimal::min).orElse(BigDecimal.ZERO);
Run Code Online (Sandbox Code Playgroud)

谢谢.

java java-8 java-stream

14
推荐指数
2
解决办法
910
查看次数

Java8:流findFirst结果

我想知道有没有办法摆脱警告findFirst().get()而不使用.orElse()如果我100%知道每次都有结果,所以我永远不会到达那里NoSuchElementException.例如,让我们看看以下代码:

    List<String> myList = new ArrayList<>();
    myList.add("Test");
    myList.add("Example");
    myList.add("Sth");

    String fisrstString = myList.stream().findFirst().get(); // here I surely get "Test" 
Run Code Online (Sandbox Code Playgroud)

我不知道其他IDE如何对待它,但是我的IDE(IntelliJ)将其视为警告('Optional.get()' without 'isPresent()').我想可能它不知道你何时可以到达NoSuchElementException那里,何时不到,或者我不知道为什么.我知道有办法解决这个警告(isPresent()检查.orElse(something)),但有无用的代码,所以我不想使用这些解决方案,因为它们是如此不必要.你知道我该怎么做,或解释这是怎么回事?

编辑:对不起NPE,它有NoSuchElementException我的错误,但我认为这个问题仍然存在.

java intellij-idea optional java-8 java-stream

14
推荐指数
4
解决办法
3万
查看次数

Java流是连续阶段的吗?

我对中间阶段的顺序的状态的问题-从施加到一个阶段的操作的所有输入流(项目)是所有级/操作施加到各流项目?

我知道这个问题可能不容易理解,所以我举一个例子.在以下流处理中:

List<String> strings = Arrays.asList("Are Java streams intermediate stages sequential?".split(" "));
strings.stream()
           .filter(word -> word.length() > 4)
           .peek(word -> System.out.println("f: " + word))
           .map(word -> word.length())
           .peek(length -> System.out.println("m: " + length))
           .forEach(length -> System.out.println("-> " + length + "\n"));
Run Code Online (Sandbox Code Playgroud)

我对这段代码的期望是它会输出:

f: streams
f: intermediate
f: stages
f: sequential?

m: 7
m: 12
m: 6
m: 11

-> 7
-> 12
-> 6
-> 11
Run Code Online (Sandbox Code Playgroud)

相反,输出是:

f: streams
m: 7
-> 7

f: intermediate
m: …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

14
推荐指数
1
解决办法
1768
查看次数

使用Optional.orElseThrow在Stream中抛出RuntimeException

以下代码工作正常:

Stream.of("key1", "key2")
   .map(key -> {
      SomeObject foo = service.find(key);
      if (foo == null) {
         throw new RuntimeException("No entity found with key: " + key);
      }
      return foo;
   })
   // ...
Run Code Online (Sandbox Code Playgroud)

但是,当我从Optional使用orElseThrow时:

Stream.of("key1", "key2")
   .map(key -> Optional.ofNullable(someService.find(key))
         .orElseThrow(() -> new RuntimeException("No entity found with key: " + key)))
   // ...
Run Code Online (Sandbox Code Playgroud)

我得到一个编译时错误:

错误:(129,33)java:未报告的异常X; 必须被抓住或宣布被抛出

两者都抛出一个RuntimeException,为什么使用Optional的方法不起作用的任何想法?

更新:我的构建基础架构,我尝试使用IntelliJ和Maven编译它:

$ mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T17:41:47+01:00)
Maven home: C:\Tools\apache-maven-3.3.9
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_91\jre
Default locale: de_AT, …
Run Code Online (Sandbox Code Playgroud)

java optional runtimeexception java-stream

13
推荐指数
1
解决办法
4530
查看次数

Java 8流:从一个列表中查找与基于另一个列表中的值计算的条件匹配的项

有两个类和两个相应的列表:

class Click {
   long campaignId;
   Date date;
}

class Campaign {
   long campaignId;
   Date start;
   Date end;
   String type;
}

List<Click> clicks = ..;
List<Campaign> campaigns = ..;
Run Code Online (Sandbox Code Playgroud)

并希望找到所有Clickclicks:

  1. 列表中有相应Campaigncampaigns,即Campaign具有相同的campaignIdAND

  2. Campaigntype="预期"和

  3. Campaigns.start< click.date<Campaigns.end

到目前为止,我有以下实现(这对我来说似乎令人困惑和复杂):

clicks.
        stream().
        filter(click -> campaigns.stream().anyMatch(
                campaign -> campaign.getCampaignType().equals("prospecting") &&
                        campaign.getCampaignId().equals(click.getCampaignId()) &&
                        campaign.getStart().after(click.getDate()) &&
                        campaign.getEnd().before(click.getDate()))).
        collect(toList());
Run Code Online (Sandbox Code Playgroud)

我想知道这个问题是否有更简单的解决方案.

java java-8 java-stream

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

允许为 self 分配新的结构值的理由是什么?

我不是 Swift 程序员,所以我对这门语言一无所知。我只是出于好奇才问。我遇到了一种语言构造,其中变异函数内部被分配了一个新值,如下例中的self函数所示。moveByAssigmentToSelf

struct Point {
    var x = 0.0
    var y = 0.0

    mutating func moveByAssigmentToSelf(_ deltaX: Double, _ deltaY: Double) {
        self = Point(x: x + deltaX, y: y + deltaY)
    }

    mutating func moveByMutatingMembers(_ deltaX: Double, _ deltaY: Double) {
        self.x += deltaX
        self.y += deltaY
    }
}
Run Code Online (Sandbox Code Playgroud)

来自 C/C++/Java/C# 背景,我认为它是self指向内存中某处(例如堆栈上)的结构值(开始)的指针(地址)。this对我来说,分配给C++ 结构中应该等效的东西看起来很奇怪。AFAICT,该函数moveByMutatingMembers应该具有观察上等效的效果,并且在 C++/Java 世界中是很自然的事情。

有人可以向非 Swift 程序员解释一下这个概念背后的基本原理/想法是什么吗?

我在语言参考(关于表达式的章节)中所能找到的只是以下模糊的陈述:“在初始化器、下标或实例方法中, self 指的是它出现的类型的当前实例。” “在值类型的变异方法中,您可以将该值类型的新实例分配给 self。”

我想要理解的是为什么这个分配是一个好主意,与传统的解决方案相比,它解决了哪些编程问题?

换句话说:为什么从语言设计的角度来看这有意义?或者:如果您必须使用 C++/Java …

swift

13
推荐指数
2
解决办法
1381
查看次数

Git - 显示作者贡献的统计数据

我在Android工作室的一个git项目上与一个团队合作,我希望看到每个作者在编写的行或行编辑等方面的贡献...是否有这样的工具/插件可以显示统计信息作者?

git

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

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

我想找出一个字符串流是否至少有一个出现在另一个字符串StringSet<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万
查看次数

使用Java 8流API的累积总和

我有一个整数列表,说list1,我想得到另一个列表list2,它将包含从开始到当前索引为止的累积总和。如何使用Stream API Java 8做到这一点?

List<Integer> list1 = new ArrayList<>();
list1.addAll(Arrays.asList(1, 2, 3, 4));
List<Integer> list2 = new ArrayList<>();
// initialization
list2.add(list1.get(0));
for(int i=1;i<list1.size();i++) {
// increment step
    list2.add(list2.get(i-1) + list1.get(i));
}
Run Code Online (Sandbox Code Playgroud)

如何将上述命令式代码转换为声明代码?

list2 should be [1, 3, 6, 10]
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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