有没有一种简洁的方法来迭代流,同时有权访问流中的索引?
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());
与那里给出的LINQ示例相比,这似乎相当令人失望
string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();
有更简洁的方法吗?
此外,看起来拉链已移动或被移除......
在许多其他语言中,例如.Haskell,很容易多次重复一个值或函数,例如.获取值为1的8个副本的列表:
take 8 (repeat 1)
但我还没有在Java 8中找到它.在Java 8的JDK中是否有这样的功能?
或者相当于范围的东西
[1..8]
它似乎是Java中冗长语句的明显替代品
for (int i = 1; i <= 8; i++) {
    System.out.println(i);
}
有类似的东西
Range.from(1, 8).forEach(i -> System.out.println(i))
虽然这个特殊的例子实际上看起来并不简洁......但希望它更具可读性.
如果我在顺序流上调用collect(例如,从调用Collection.stream()),那么它将使用我传递的汇编器参数来收集吗?我猜不是,但我在文档中看不到任何内容.如果我是正确的,那么不得不提供我知道不会被使用的东西(如果我知道它是顺序流)似乎是不幸的.
在Java 8中,Stream有一个方法减少:
T reduce(T identity, BinaryOperator<T> accumulator);
累加器运算符是否允许修改其任一参数?我认为不是因为JavaDoc说累加器应该是NonInterfering,尽管所有的例子都谈到修改集合,而不是修改集合的元素.
所以,举一个具体的例子,如果我们有
 integers.reduce(0, Integer::sum);
并假设一个Integer可变的时刻,sum可以通过向其添加(就地)第二个参数的值来修改其第一个参数吗?
我认为不是,但我也想要一个这个干扰导致问题的例子.
我有一个遗留Java应用程序,其代码类似于此
ServiceLoader.load(SomeInterface.class)
我想为这段代码提供SomeInterface的模拟实现.我使用mockito模拟框架.
不幸的是我无法更改遗留代码,我不希望静态添加任何内容(例如,向META-INF添加内容).
在测试中是否有一种简单的方法可以做到这一点,即.在测试的运行时?
有没有办法在TeamCity构建中指定要签出的SVN修订版?
如果我尝试使用@表示法更改SVN URL以包含修订版,例如.
SVN + SSH:// SVN /一些/ URL @ 1234
然后我收到一个错误("Unknown path kind").
我搜索了所有TeamCity文档,但没有找到合适的内容.
这个问题的背景是我想对某个特定版本进行测试,因为某些原因在过去没有这样做(例如,当时URL不在TeamCity中).
我想创建一个带有两个参数的类.一个应该简单地输入为T.另一个应该被输入为扩展T和T的东西SomeInterface<T>.当我尝试这个时
public class SomeClass<T, S extends SomeInterface<T> & T>
然后Java抱怨
"类型T不是接口;它不能被指定为有界参数"
如果相反,我试图为S创建一个接口
public interface TandSomeInterface<T> extends SomeInterface<T>, T
然后Java抱怨
"不能将类型参数T称为超类型"
有没有办法在Java中这样做?我想你可以用C++做到这一点......?
StreamEx库似乎真正帮助我简明地编写Java 8流,特别是在考虑地图时(mapKeyValue例如,使用手动取消打包地图条目).
如果我在地图中有一个条目流,在vanilla Java 8中我可以用这样的方式对值进行求和:
someMap.entrySet().stream()
    .mapToDouble(Entry::getValue)
    .sum()
我也可以在StreamEx中执行此操作,但我希望在StreamEx中看到更好的方法,尽管我能想到的最好方法是:
EntryStream.of(someMap)
    .values()
    .mapToDouble(d -> d)
    .sum();
这不是更好.
有没有更好的方法让我失踪?
我有一个使用CMS垃圾收集的Java应用程序,每天都有几次"ParNew(促销失败)"完整的GC(见下面的例子).我知道当垃圾收集在旧一代中找不到足够的(连续的)空间来从新一代中提升对象时,会发生促销失败.在这一点上,它被迫做一个昂贵的世界末日GC.我想避免这种事件.
我已经阅读了几篇提出可行解决方案的文章,但我想在这里澄清/巩固它们:
如果它是相关的,这里是我当前的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: …是否有一个Java工具,给定一组JUnit测试和一个要测试的类,它会告诉你测试中哪些类的行被测试?即.要求测试成功运行.我的意思并不是"代码覆盖率",它只会告诉您是否执行了一行,而是更强大的代码:测试所需的行是否通过?
我经常注释掉一行代码并运行一个测试,看看测试是否真的在测试那行代码.我认为这可以通过半智能工具自动完成(例如,类似IDE的东西,可以解决从方法中删除的内容,同时保持其可编辑性).
java ×9
java-8 ×5
java-stream ×4
accumulator ×1
extends ×1
generics ×1
junit ×1
mockito ×1
performance ×1
reduce ×1
streamex ×1
svn ×1
teamcity ×1