问题出在评论中.我想引用外部函数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,但还有另一种方式吗?
我正在阅读"实践中的java并发",作者说:"一个完全由线程安全类组成的程序可能不是线程安全的".这怎么可能?我似乎不明白,有人可以提供一个例子吗?
假设我在包中的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语言的实现者使得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 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方法返回一个字符串,您将获得相同的结果,而无需使用提取名称的函数映射原始流.
当每个对象应该继承toString的Object?
我写了下面的代码,
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)
我想知道为什么之前的订单在添加操作后被更改了.