小编Cod*_*Man的帖子

如何从lambda引用外部函数?

问题出在评论中.我想引用外部函数append,而不是那个中定义的函数,StringBuilder我该怎么做?

fun append(c: Char) {
    println("TEST")
}

fun sbTest() = with(StringBuilder()) {
    for(c in 'A'..'Z') {
        append(c) // how do I refer to the append function declared above?
    }
    toString()
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以引入一个函数引用变量,如下所示:

val f = ::append

并打电话f而不是append,但还有另一种方式吗?

kotlin

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

程序如何仅包含线程安全的类,但不是线程安全的?

我正在阅读"实践中的java并发",作者说:"一个完全由线程安全类组成的程序可能不是线程安全的".这怎么可能?我似乎不明白,有人可以提供一个例子吗?

language-agnostic concurrency multithreading

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

公共修饰符在包私有类中是多余的吗?

假设我在包中的Test.java中声明了一个类Test com.test:

class Test {
    public void test() {

    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道,test()这里的方法冗余不是公共访问修饰符吗?因为intellij没有给我一个提示,说它是.

我认为只有当班级Test包含public static void main(String[] args) {}我是对还是错时,这并不是多余的?

java

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

有效的最终/最终限制是否无用?

我无法理解为什么java语言的实现者使得lambda中使用的变量和从函数作用域传递的变量必须是最终的.

我反编译了这段代码:

public class Main {
    @FunctionalInterface
    interface Test {
        void method(int t);
    }

    static void test(Test t) {
        t.method(3);
    }

    public static void main(String... args) {
        int a = 3;
        test((i)-> {
            System.out.println(a + i);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

而编译器所做的就是复制该变量,就好像它是通过构造函数传递一样.我得到了这三个班:

1:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import Main.1;
import Main.Test;

public class Main {
    public Main() {
    }

    static void test(Test var0) {
        var0.method(3);
    }

    public static …
Run Code Online (Sandbox Code Playgroud)

java jvm

2
推荐指数
1
解决办法
85
查看次数

你可以收集(加入())而不映射到字符串吗?

我正在阅读java 8,并且作者说如果你有一个覆盖toString方法的类,那么在进行collect(joined())时你不需要将流映射到字符串.一个例子:

    public static void main(String... args) {
        List<Person> people =
        Arrays.asList(
                new Person(23, "Paul"),
                new Person(23, "John"),
                new Person(23, "Greg"),
                new Person(24, "Greg"),
                new Person(25, "Paul")
        ); // Person overrides toString

        String peopleString = people
                .stream()
                .collect(Collectors.joining());

        System.out.println(peopleString);

    }
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,只有这样:

String peopleString = people
                .stream()
                .map(Person::toString)
                .collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)

工作,所以这本书错了吗?此外,为什么他说(我改变了一点措辞):

另请注意,如果某个类有一个toString方法返回一个字符串,您将获得相同的结果,而无需使用提取名称的函数映射原始流.

当每个对象应该继承toStringObject

java java-8 java-stream

2
推荐指数
1
解决办法
109
查看次数

如何在HashSet中保留插入顺序?

我写了下面的代码,

public int longestConsecutive(int[] nums) {
Set<Integer> num_set = new HashSet<Integer>();
for (int num : nums) {
    num_set.add(num);
    System.out.println("num_set: " + num_set.toString());
}
Run Code Online (Sandbox Code Playgroud)

然后我有测试用例,

int[] nums  = {100, 4, 200, 1, 3, 2};
Run Code Online (Sandbox Code Playgroud)

然后在最后一行输出中,控制台显示,

num_set: [1, 2, 3, 100, 4, 200]
Run Code Online (Sandbox Code Playgroud)

我想知道为什么之前的订单在添加操作后被更改了.

java set

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