小编fge*_*fge的帖子

Java 8流的.min()和.max():为什么要编译?

注意:这个问题源于一个死链接,这是以前的SO问题,但是这里......

看到这个代码(注意:我不知道,这个代码将不能"工作",而Integer::compare应使用-我只是提取它从链接的问题):

final ArrayList <Integer> list 
    = IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList());

System.out.println(list.stream().max(Integer::max).get());
System.out.println(list.stream().min(Integer::min).get());
Run Code Online (Sandbox Code Playgroud)

据javadoc的.min().max(),两者的参数应该是一个Comparator.然而,这里的方法引用是Integer类的静态方法.

那么,为什么要编译呢?

java java-8 java-stream

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

BigInteger的.isProbablePrime()的可能用例是什么?

这种方法BigInteger.isProbablePrime()很奇怪; 从文档中,这将告诉一个数字是否是素数的概率1 - 1 / 2^arg,其中arg是整数参数.

它已经存在于JDK很长一段时间了,所以它意味着它必须有用.我在计算机科学和算法(以及数学)方面的有限知识告诉我,知道一个数字是否"可能"是一个素数而不是一个素数并不是真的有意义.

那么,人们想要使用这种方法的可能情况是什么?密码?

java primes

83
推荐指数
6
解决办法
5756
查看次数

如何在同一文件中设置项目名称/组/版本以及{source,target}兼容性?

我打算将gradle的使用概括为我的项目,并希望在任何地方重用相同的构建文件.不幸的是,我在单个文件中尝试定义$ subject中提到的属性时遇到了麻烦,以便简化迁移.

这是gradle 1.6.

我尝试了什么,在所有尝试中都失败了:

  • gradle.properties:无法修改名称(只读,必须使用settings.gradle并覆盖项目名称!); {source,target}Compatibility没有考虑到;
  • settings.gradle:{source,target}Compatibility没有考虑到!

那么,实现这一目标的正确方法是什么?我到目前为止所做的尝试gradle.properties:

group = something
name = whatever  # cannot do!
version = whatever
sourceCompatibility = whatever # not taken into account!
Run Code Online (Sandbox Code Playgroud)

并在settings.gradle:

sourceCompatibility = "whatever";  # not taken into account!
Run Code Online (Sandbox Code Playgroud)

编辑嗯,"名称"问题无法解决; 对于其余的,我使用了另一个我在构建文件中应用的文件."名称"处理真的不对:/

编辑2这是2014年和gradle 1.12,问题仍未解决......

java gradle

79
推荐指数
4
解决办法
9万
查看次数

如何让gradle在maven用户的项目根目录下生成有效的pom.xml文件?

虽然现在只有两天了,我肯定会在所有Java项目中使用gradle销售,并从我所有项目的根目录中删除pom.xml.

但是,我希望保持maven兼容,因为我希望gradle任务能够在用户需要时在项目的根目录下生成合适的pom.xml.

此时,我对pom.xml的唯一引用是在build.gradle文件的这一部分中(这是很少的修改,这里有什么):

uploadArchives {
    repositories {
        mavenDeployer {
            beforeDeployment {
                MavenDeployment deployment -> signing.signPom(deployment);
            }

            repository(url: sonatypeRepoURI) {
                authentication(userName: sonatypeUsername,
                    password: sonatypePassword);
            }

            pom.project {
                name "${name}";
                packaging "bundle";
                description "${description}";
                url "${projectURL}";

                scm {
                    url "${gitroscm}";
                    connection "${gitroscm}";
                    developerConnection "${gitrwscm}";
                }

                licenses {
                    license {
                        name "Lesser General Public License, version 3 or greater";
                        url "http://www.gnu.org/licenses/lgpl.html";
                        distribution "repo";
                    }
                }

                developers {
                    developer {
                        id "whocares";
                        name "whocares";
                        email "whocares";
                    }
                }
            }
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

java compatibility gradle maven

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

这是Files.lines()中的错误,还是我误解了并行流的某些内容?

环境:Ubuntu x86_64(14.10),Oracle JDK 1.8u25

我尝试使用并行流Files.lines()但我想要.skip()第一行(它是带有标题的CSV文件).所以我试着这样做:

try (
    final Stream<String> stream = Files.lines(thePath, StandardCharsets.UTF_8)
        .skip(1L).parallel();
) {
    // etc
}
Run Code Online (Sandbox Code Playgroud)

但是后来一列未能解析成一个int ...

所以我尝试了一些简单的代码.文件问题很简单:

$ cat info.csv 
startDate;treeDepth;nrMatchers;nrLines;nrChars;nrCodePoints;nrNodes
1422758875023;34;54;151;4375;4375;27486
$
Run Code Online (Sandbox Code Playgroud)

代码同样简单:

public static void main(final String... args)
{
    final Path path = Paths.get("/home/fge/tmp/dd/info.csv");
    Files.lines(path, StandardCharsets.UTF_8).skip(1L).parallel()
        .forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)

系统地得到以下结果(好吧,我只运行了大约20次):

startDate;treeDepth;nrMatchers;nrLines;nrChars;nrCodePoints;nrNodes
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?


编辑似乎问题或误解比这更根深蒂固(下面的两个例子是由FreeNode的## java编写的):

public static void main(final String... args)
{
    new BufferedReader(new StringReader("Hello\nWorld")).lines()
        .skip(1L).parallel()
        .forEach(System.out::println);

    final Iterator<String> iter
        = Arrays.asList("Hello", "World").iterator();
    final Spliterator<String> spliterator
        = Spliterators.spliteratorUnknownSize(iter, …
Run Code Online (Sandbox Code Playgroud)

java parallel-processing java-8 java-stream

34
推荐指数
3
解决办法
2842
查看次数

可以有一个(Java 7)文件系统,其路径.isAbsolute()但具有空根?

javadoc .isAbsolute()说:

判断此路径是否绝对.
绝对路径是完整的,因为它不需要与其他路径信息组合以便定位文件.

返回: true if且仅当此路径是绝对路径时

javadoc .getRoot()说:

以Path对象的形式返回此路径的根组件,如果此路径没有根组件,则返回null.

返回: 表示此路径的根组件的路径,或null

好的,所以,我在这里不知所措; 有没有任何文件系统的路径可能是绝对没有根的路径?


编辑:请注意,可能存在具有根但不是绝对的路径.例如,这些在Windows系统上:

  • C:foo;
  • \foo\bar.

但我在这里要求反过来:没有根和绝对.

java java-7 java.nio.file

33
推荐指数
3
解决办法
616
查看次数

收集器的组合器功能是否可以用于顺序流?

示例程序:

public final class CollectorTest
{
    private CollectorTest()
    {
    }

    private static <T> BinaryOperator<T> nope()
    {
        return (t, u) -> { throw new UnsupportedOperationException("nope"); };
    }

    public static void main(final String... args)
    {
        final Collector<Integer, ?, List<Integer>> c
            = Collector.of(ArrayList::new, List::add, nope());

        IntStream.range(0, 10_000_000).boxed().collect(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,为了简化这里的问题,没有最终的转换,因此生成的代码非常简单.

现在,IntStream.range()生成一个顺序流.我只是将结果打成Integers然后我的设计Collector将它们收集到一个List<Integer>.很简单.

无论我运行多少次这个示例程序,UnsupportedOperationException从不命中,这意味着我的虚拟组合器永远不会被调用.

我有点期待这个,但后来我已经误解了流,我不得不问这个问题......

可以在Collector当流的组合曾经被称为保证是连续的?

java java-8 java-stream

31
推荐指数
1
解决办法
3201
查看次数

设计具有可变条目到期的Guava LoadingCache

我正在使用Guava的LoadingCache进入我的项目来处理线程(安全,友好)缓存加载,它运行得非常好.但是,存在限制.

定义缓存的当前代码如下所示:

cache = CacheBuilder.newBuilder().maximumSize(100L).build(new CacheLoader<K, V>()
{
    // load() method implemented here
}
Run Code Online (Sandbox Code Playgroud)

我没有指定到期时间.

问题是根据密钥的值,某些相关值可能会过期而其他值可能不会过期.并且CacheLoader不考虑这一点,如果您指定到期时间,则它适用于每个条目.

你会如何解决这个问题?

java multithreading guava

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

如何在3.4+中禁用JooQ的自我广告消息?

我是JooQ的忠实粉丝,不幸的是,自从3.3升级后,每次我的代码退出之前都会向控制台输出一条非常烦人的消息:

Feb 02, 2015 7:28:06 AM org.jooq.tools.JooqLogger info
INFO: 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<snip>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  Thank you for using jOOQ 3.5.1
Run Code Online (Sandbox Code Playgroud)

不幸的是,我根本无法删除此日志.

请注意,我不使用slf4j,也不使用log4j或任何日志API; 因此,我唯一可用的机制是jul

我试图使用它完全禁用它:

static {
    Stream.of(Logger.getAnonymousLogger(), Logger.getGlobal(),
        Logger.getLogger("org.jooq.tools.JooqLogger")
    ).forEach(l -> {
        l.setLevel(Level.OFF);
        final Handler[] handlers = l.getHandlers();
        Arrays.stream(handlers).forEach(l::removeHandler);
    });
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不起作用,消息仍然出现.

如何在修改代码时使这条消息消失,我想避免在这里?

java logging jooq

27
推荐指数
3
解决办法
5591
查看次数

你能用mockito(1.10.17)在接口中使用默认方法吗?

我是mockito的忠实粉丝,不幸的是,对于我使用Java 8的一个项目,它失败了...

场景:

public final class MockTest
{
    @Test
    public void testDefaultMethodsWithMocks()
    {
        final Foo foo = mock(Foo.class);

        //when(foo.bar()).thenCallRealMethod();

        assertThat(foo.bar()).isEqualTo(42);
    }

    @FunctionalInterface
    private interface Foo
    {
        int foo();

        default int bar()
        {
            return 42;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,测试失败并foo.bar()返回0.

当我取消注释该when()行时,我得到一个堆栈跟踪...

java.lang.NoSuchMethodError: java.lang.Object.bar()I
    at com.github.fge.lambdas.MockTest.testDefaultMethodsWithMocks(MockTest.java:18)
Run Code Online (Sandbox Code Playgroud)

这是maven上最新的稳定版本; 谷歌搜索周围没有告诉我关于Java 8中这个新功能的模拟状态...

你能否以其他方式使其工作,而不是实现接口和spy()它们(这是有效的)?

java mockito java-8 default-method

21
推荐指数
3
解决办法
8299
查看次数