前几天我才知道你可以做到这一点
new Object() {
void hello() {
System.out.println("Hello World!");
}
}.hello();
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很奇怪.当然,创建的对象的静态类型是Object,所以没有方法hello()?它几乎完全没有意义(hello例如,不可能调用两次).
我有2个问题.
hello就是这样.反思怎么样?谢谢
为什么第一种方式是正确的,但第二种方式不是?
第一种方式:
new Object() {
public void a() {
/*code*/
}
}.a();
Run Code Online (Sandbox Code Playgroud)
第二种方式:
Object object = new Object() {
public void a() {
/*code*/
}
};
object.a();
Run Code Online (Sandbox Code Playgroud)
我在哪里可以找到更多相关信息?
正如本博客所述,我们现在可以使用本地类型推断编写以下内容(据我所知,这是以前在不引入更多代码的情况下无法实现的):
public static void main(String... args) {
var duck = (Quacks & Waddles) Mixin::create;
duck.quack();
duck.waddle();
}
interface Quacks extends Mixin {
default void quack() {
System.out.println("Quack");
}
}
interface Waddles extends Mixin {
default void waddle() {
System.out.println("Waddle");
}
}
interface Mixin {
void __noop__();
static void create() {}
}
Run Code Online (Sandbox Code Playgroud)
这个问题可能过于宽泛或主要基于意见,但在利用这样的交集类型时是否存在任何有用的应用?
我想过滤Person类的列表,最后使用Streams映射到Java中的一些匿名类.我能够在C#中轻松地做同样的事情.
人类
class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
用于以期望格式映射结果的代码.
List<Person> lst = new List<Person>();
lst.Add(new Person() { Name = "Pava", Address = "India", Id = 1 });
lst.Add(new Person() { Name = "tiwari", Address = "USA", Id = 2 });
var result = lst.Select(p => new { Address = p.Address, Name = p.Name }).ToList();
Run Code Online (Sandbox Code Playgroud)
现在,如果我想访问新创建的类型的任何属性,我可以使用下面提到的语法轻松访问.
Console.WriteLine( result[0].Address);
Run Code Online (Sandbox Code Playgroud)
理想情况下,我应该使用循环来迭代结果.
我知道在java中我们收集了ToList并映射了Select.但我无法只选择Person类的两个属性.我怎么做Java
有人可以解释的行为o2吗?是因为编译器优化吗?它是否记录在 JLS 的某处?
public class Test {
public static void main(String[] args) {
Object o1 = new Object() {
String getSomething() {
return "AAA";
}
};
// o1.getSomething(); // FAILS
String methods1 = Arrays.toString(o1.getClass().getMethods());
var o2 = new Object() {
String getSomething() {
return "AAA";
}
};
o2.getSomething(); // OK
String methods2 = Arrays.toString(o2.getClass().getMethods());
System.out.println(methods1.equals(methods2));
}
}
Run Code Online (Sandbox Code Playgroud)
产生的输出是
真的
[更新]
经过一些富有成效和有用的讨论,我想我可以理解这种行为(如果我的假设有误,请发表评论)。
首先,感谢@user207421,他解释说 Java 编译器将类型o2视为与 RHS 相同的类型,其中:
Object getSomething方法然后感谢@Joachim Sauer …
我只是试着理解Java中的流,并且我坚持排序阶段.我的目的是用一条流来获得最昂贵的蔬菜披萨.在这一点上,我得到披萨价格,但我无法对它进行排序.谁能告诉我应该怎么做呢?
我尝试这个:
pizzas.stream()
.flatMap(pizza -> Stream.of(pizza.getIngredients())
.filter(list -> list.stream().noneMatch(Ingredient::isMeat))
.map(list -> list.stream().map(Ingredient::getPrice).reduce(0,(a, b) -> a + b))
.sorted((o1, o2) -> o1.intValue() - o2.intValue())
)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
此代码返回未分类的比萨饼值.