小编Skl*_*ogW的帖子

覆盖类外的Object#equals(Object)

使用时是否可以在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).

java equals

16
推荐指数
3
解决办法
1485
查看次数

Java Streams | groupingBy相同的元素

我有一个单词流,我想根据相同元素(=单词)的出现对它们进行排序.

例如:{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表达式中的单个元素,但我不知道如何到达每个元素的"外部"以检查是否相等.

谢谢

java java-8 java-stream

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

如何用单位命名变量?

例子:

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,即使它看起来不太好?一个想法是将它添加到文档中,但是如果它是类中的全局变量呢?

java variables

5
推荐指数
1
解决办法
1726
查看次数

按第一个字符分组单词

我有:一行一行的文本文件.每个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)

java java-8 java-stream

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

仅为了可读性而引入变量?

仅仅为了介绍变量是一个好主意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)

这可能是一个极端的例子,但我认为你明白了.

我没有在代码中看到这个,我想知道这是否是一个有用的方法?

谢谢

背景:我正在尝试从大学过渡到入门级开发人员,目前我专注于清洁编码.

java readability

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

了解通配符约束<?超级T>

我可以使用基本的通用表达式,但是通配符约束只是让我心烦意乱.

信息:学生扩展人和人扩展动物

 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)

java generics

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

标签 统计

java ×6

java-8 ×2

java-stream ×2

equals ×1

generics ×1

readability ×1

variables ×1