小编Gra*_*oss的帖子

是否有一种简洁的方法来迭代Java 8中的索引流?

有没有一种简洁的方法来迭代流,同时有权访问流中的索引?

String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"};

List<String> nameList;
Stream<Integer> indices = intRange(1, names.length).boxed();
nameList = zip(indices, stream(names), SimpleEntry::new)
        .filter(e -> e.getValue().length() <= e.getKey())
        .map(Entry::getValue)
        .collect(toList());
Run Code Online (Sandbox Code Playgroud)

与那里给出的LINQ示例相比,这似乎相当令人失望

string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
Run Code Online (Sandbox Code Playgroud)

有更简洁的方法吗?

此外,看起来拉链已移动或被移除......

java java-8 java-stream

361
推荐指数
10
解决办法
24万
查看次数

Java 8是否提供了重复值或函数的好方法?

在许多其他语言中,例如.Haskell,很容易多次重复一个值或函数,例如.获取值为1的8个副本的列表:

take 8 (repeat 1)
Run Code Online (Sandbox Code Playgroud)

但我还没有在Java 8中找到它.在Java 8的JDK中是否有这样的功能?

或者相当于范围的东西

[1..8]
Run Code Online (Sandbox Code Playgroud)

它似乎是Java中冗长语句的明显替代品

for (int i = 1; i <= 8; i++) {
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

有类似的东西

Range.from(1, 8).forEach(i -> System.out.println(i))
Run Code Online (Sandbox Code Playgroud)

虽然这个特殊的例子实际上看起来并不简洁......但希望它更具可读性.

java java-8

110
推荐指数
4
解决办法
5万
查看次数

Java 8中的顺序流是否在调用collect时使用了combiner参数?

如果我在顺序流上调用collect(例如,从调用Collection.stream()),那么它将使用我传递的汇编器参数来收集吗?我猜不是,但我在文档中看不到任何内容.如果我是正确的,那么不得不提供我知道不会被使用的东西(如果我知道它是顺序流)似乎是不幸的.

java java-8 java-stream

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

Java 8中的reduce累加器是否允许修改其参数?

在Java 8中,Stream有一个方法减少:

T reduce(T identity, BinaryOperator<T> accumulator);
Run Code Online (Sandbox Code Playgroud)

累加器运算符是否允许修改其任一参数?我认为不是因为JavaDoc说累加器应该是NonInterfering,尽管所有的例子都谈到修改集合,而不是修改集合的元素.

所以,举一个具体的例子,如果我们有

 integers.reduce(0, Integer::sum);
Run Code Online (Sandbox Code Playgroud)

并假设一个Integer可变的时刻,sum可以通过向其添加(就地)第二个参数的值来修改其第一个参数吗?

我认为不是,但我也想要一个这个干扰导致问题的例子.

java reduce accumulator java-8 java-stream

16
推荐指数
1
解决办法
4363
查看次数

在Java中,如何模拟使用ServiceLoader加载的服务?

我有一个遗留Java应用程序,其代码类似于此

ServiceLoader.load(SomeInterface.class)
Run Code Online (Sandbox Code Playgroud)

我想为这段代码提供SomeInterface的模拟实现.我使用mockito模拟框架.

不幸的是我无法更改遗留代码,我不希望静态添加任何内容(例如,向META-INF添加内容).

在测试中是否有一种简单的方法可以做到这一点,即.在测试的运行时?

java mockito serviceloader

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

我可以在TeamCity构建中指定要结帐的修订吗?

有没有办法在TeamCity构建中指定要签出的SVN修订版?

如果我尝试使用@表示法更改SVN URL以包含修订版,例如.

SVN + SSH:// SVN /一些/ URL @ 1234

然后我收到一个错误("Unknown path kind").

我搜索了所有TeamCity文档,但没有找到合适的内容.

这个问题的背景是我想对某个特定版本进行测试,因为某些原因在过去没有这样做(例如,当时URL不在TeamCity中).

svn teamcity

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

在Java中扩展T和SomeInterface <T>

我想创建一个带有两个参数的类.一个应该简单地输入为T.另一个应该被输入为扩展T和T的东西SomeInterface<T>.当我尝试这个时

public class SomeClass<T, S extends SomeInterface<T> & T>
Run Code Online (Sandbox Code Playgroud)

然后Java抱怨

"类型T不是接口;它不能被指定为有界参数"

如果相反,我试图为S创建一个接口

public interface TandSomeInterface<T> extends SomeInterface<T>, T
Run Code Online (Sandbox Code Playgroud)

然后Java抱怨

"不能将类型参数T称为超类型"

有没有办法在Java中这样做?我想你可以用C++做到这一点......?

java generics extends multiple-inheritance

8
推荐指数
1
解决办法
1465
查看次数

如何在streamex中对地图流的double值求和?

StreamEx库似乎真正帮助我简明地编写Java 8流,特别是在考虑地图时(mapKeyValue例如,使用手动取消打包地图条目).

如果我在地图中有一个条目流,在vanilla Java 8中我可以用这样的方式对值进行求和:

someMap.entrySet().stream()
    .mapToDouble(Entry::getValue)
    .sum()
Run Code Online (Sandbox Code Playgroud)

我也可以在StreamEx中执行此操作,但我希望在StreamEx中看到更好的方法,尽管我能想到的最好方法是:

EntryStream.of(someMap)
    .values()
    .mapToDouble(d -> d)
    .sum();
Run Code Online (Sandbox Code Playgroud)

这不是更好.

有没有更好的方法让我失踪?

java java-8 java-stream streamex

8
推荐指数
1
解决办法
978
查看次数

在Java CMS GC中避免升级失败

我有一个使用CMS垃圾收集的Java应用程序,每天都有几次"ParNew(促销失败)"完整的GC(见下面的例子).我知道当垃圾收集在旧一代中找不到足够的(连续的)空间来从新一代中提升对象时,会发生促销失败.在这一点上,它被迫做一个昂贵的世界末日GC.我想避免这种事件.

我已经阅读了几篇提出可行解决方案的文章,但我想在这里澄清/巩固它们:

  1. -Xmx:增加堆大小,例如.从2G到4G - 简单的解决方案,为老一代提供更多的空间 - 似乎在我的经验中运作得相当好
  2. -XX:NewRatio:增加NewRatio,例如.从2到4,为了增加老一代/减少新一代 - 给老一代更多的空间 - 似乎没有太多,如果有的话,从我的实验到目前为止的效果
  3. -XX:PromotedPadding:增加为避免促销失败而提供的填充量 - 但是我找不到有关为此参数赋予什么值的任何建议 - 是否有人知道该值的含义,默认值是什么,或者是什么值为尝试?
  4. -XX:CMSInitiatingOccupancyFraction -XX:+ UseCMSInitiatingOccupancyOnly:让CMS循环更快启动以避免老一代的空间不足 - 我还没有尝试过这个解决方案 - 尝试哪些值是合理的?什么是默认值?
  5. 不要在堆上分配非常大的对象:一个非常大的对象可能难以推广,因为它需要在老一代中有大量连续的可用空间 - 这不适用于我的应用程序,据我所知

如果它是相关的,这里是我当前的GC选项和促销失败事件之前的日志样本.

-Xmx4g -XX:+UseConcMarkSweepGC -XX:NewRatio=1

2014-12-19T09:38:34.304+0100: [GC (Allocation Failure) [ParNew: 1887488K->209664K(1887488K), 0.0685828 secs] 3115998K->1551788K(3984640K), 0.0690028 secs] [Times: user=0.50 sys=0.02, real=0.07 secs] 
2014-12-19T09:38:35.962+0100: [GC (Allocation Failure) [ParNew: 1887488K->208840K(1887488K), 0.0827565 secs] 3229612K->1687030K(3984640K), 0.0831611 secs] [Times: user=0.39 sys=0.03, real=0.08 secs] 
2014-12-19T09:38:39.975+0100: [GC (Allocation Failure) [ParNew: 1886664K->114108K(1887488K), 0.0442130 secs] 3364854K->1592298K(3984640K), 0.0446680 secs] [Times: user=0.31 sys=0.00, real=0.05 secs] 
2014-12-19T09:38:44.818+0100: …
Run Code Online (Sandbox Code Playgroud)

java performance garbage-collection concurrent-mark-sweep

7
推荐指数
1
解决办法
6530
查看次数

是否有一个Java工具可以找到特定JUnit测试的哪些代码行?

是否有一个Java工具,给定一组JUnit测试和一个要测试的类,它会告诉你测试中哪些类的行被测试?即.要求测试成功运行.我的意思并不是"代码覆盖率",它只会告诉您是否执行了一行,而是更强大的代码:测试所需的行是否通过?

我经常注释掉一行代码并运行一个测试,看看测试是否真的在测试那行代码.我认为这可以通过半智能工具自动完成(例如,类似IDE的东西,可以解决从方法中删除的内容,同时保持其可编辑性).

java junit

5
推荐指数
1
解决办法
236
查看次数