使用时是否可以在Object#equals(Object)本地覆盖list.contains(someObject)?
例:
class SomeObject {
...
private int id;
private String name;
@Overrdide
public boolean equals(Object other){
...
return this.id == other.id;
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我在使用时想要另一种平等怎么list.contains(someObject)办?例如,我想知道列表是否包含某个名称?是否有可能Object#equals(Object)"匿名" 覆盖?
更具体的解释为什么我需要它:
int objectId = ... // Some event which passes me the attribute of an object but not the object itself
Run Code Online (Sandbox Code Playgroud)
现在我有了List<SomeObject> someObjects,我想知道这个列表是否包含一个对象objectId而不必迭代它.
我能想到的一个"解决方案"就是使用Map<Integer, SomeObject> mapping然后someObject = mapping.get(objectId)
编辑:我的问题不是重复,因为我特别要求覆盖Object#equals(Object).
我有一个单词流,我想根据相同元素(=单词)的出现对它们进行排序.
例如:{hello,world,hello}
至
Map<String, List<String>>
Run Code Online (Sandbox Code Playgroud)
你好你好你好}
世界,{世界}
到目前为止我有什么:
Map<Object, List<String>> list = streamofWords.collect(Collectors.groupingBy(???));
Run Code Online (Sandbox Code Playgroud)
问题1:流似乎丢失了他正在处理字符串的信息,因此编译器强制我将类型更改为Object,List
问题2:我不知道在胃肠道内放入什么,以同样的方式将其分组.我知道我能够处理lambda表达式中的单个元素,但我不知道如何到达每个元素的"外部"以检查是否相等.
谢谢
例子:
public class Person {
private String name;
public String getName(){
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
这将导致类似String name = person.getName();
这是直截了当的,我知道这是什么类型的变量。
但是关于:
public class MovingObject{
private int mass;
public int getMass(){
return mass;
}
}
Run Code Online (Sandbox Code Playgroud)
这将导致 int massOfMovingobject = object.getMass();
问题:如何将单元添加到代码中,以便我真正知道我在处理什么?我应该把它命名为massInKg,即使它看起来不太好?一个想法是将它添加到文档中,但是如果它是类中的全局变量呢?
我有:一行一行的文本文件.每个String包含一行.
我想要的:使用Java Streams按第一个字符对所有单词进行分组.
到目前为止我所拥有的:
public static Map<Character, List<String>> groupByFirstChar(String fileName)
throws IOException {
return Files.lines(Paths.get(PATH)).
flatMap(s -> Stream.of(s.split("[^a-zA-Z]"))).
map(s -> s.toLowerCase()).
sorted((s1, s2) -> s1.compareTo(s2)).
collect(Collectors.groupingBy(s -> s.charAt(0)));
}
Run Code Online (Sandbox Code Playgroud)
问题:我得到一个例外
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:646)
at textana.TextAnalysisFns.lambda$16(TextAnalysisFns.java:110)
at textana.TextAnalysisFns$$Lambda$36/159413332.apply(Unknown Source)
at java.util.stream.Collectors.lambda$groupingBy$196(Collectors.java:907)
at java.util.stream.Collectors$$Lambda$23/189568618.accept(Unknown Source)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.stream.SortedOps$RefSortingSink$$Lambda$37/186370029.accept(Unknown Source)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:390)
at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at …Run Code Online (Sandbox Code Playgroud) 仅仅为了介绍变量是一个好主意readability吗?
例1:
while(nameNode1.charAt(0) == nameNode2.charAt(0) && nameNode1.length() > 1 && nameNode2.length() > 1)
{
nameNode1 = nameNode1.substring(1, nameNode1.length());
nameNode2 = nameNode2.substring(1, nameNode2.length());
}
Run Code Online (Sandbox Code Playgroud)
例2:
boolean letterFromBothNodesAreEqual_andNameHasMoreThanOneLetter = nameNode1.charAt(0) == nameNode2.charAt(0) && nameNode1.length() > 1 && nameNode2.length() > 1;
while(letterFromBothNodesAreEqual_andNameHasMoreThanOneLetter)
{
nameNode1 = nameNode1.substring(1, nameNode1.length());
nameNode2 = nameNode2.substring(1, nameNode2.length());
}
Run Code Online (Sandbox Code Playgroud)
这可能是一个极端的例子,但我认为你明白了.
我没有在代码中看到这个,我想知道这是否是一个有用的方法?
谢谢
背景:我正在尝试从大学过渡到入门级开发人员,目前我专注于清洁编码.
我可以使用基本的通用表达式,但是通配符约束只是让我心烦意乱.
信息:学生扩展人和人扩展动物
List<? super Animal> aList= new ArrayList<>();
// does not compile as expected,
// since the list is restricted to something that has Animal as superclass.
// aList.add(new Object());
aList.add(new Animal()); // I can add animal
aList.add(new Person()); // I can add Person
aList.add(new Student()); // I can add Student
Animal a = new Animal();
Animal b = new Animal();
Person p = new Person();
Student s = new Student();
// test
a = b; //I can assign …Run Code Online (Sandbox Code Playgroud)