我有一个流如:
Arrays.stream(new String[]{"matt", "jason", "michael"});
Run Code Online (Sandbox Code Playgroud)
我想删除以相同字母开头的名称,以便只留下以该字母开头的一个名称(无关紧要).
我试图了解该distinct()方法的工作原理.我在文档中读到它基于对象的"等于"方法.但是,当我尝试包装String时,我注意到从不调用equals方法,也没有删除任何内容.这里有什么我想念的吗?
包装类:
static class Wrp {
String test;
Wrp(String s){
this.test = s;
}
@Override
public boolean equals(Object other){
return this.test.charAt(0) == ((Wrp) other).test.charAt(0);
}
}
Run Code Online (Sandbox Code Playgroud)
还有一些简单的代码:
public static void main(String[] args) {
Arrays.stream(new String[]{"matt", "jason", "michael"})
.map(Wrp::new)
.distinct()
.map(wrp -> wrp.test)
.forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud) 我整个上午一直在绞尽脑汁想要提出以下算法,这尤其令人沮丧,因为我确信这是可能的.
我需要的是一个具有返回功能的类boolean.它可以被调用任意次,并且将返回true XX%.这不能是随机分布,例如:
如果比率X设置为0.6并且函数被调用100次数,我们需要返回完全60正确的结果.使用"遗留"的顺序无关紧要,例如:如果函数被调用99次数,则可以返回任一值59或60真值.
这里的诀窍是比率需要变化.
对于某些设置,我正在多线程环境中工作,因此我将"hitNumber"变量保留在一个AtomicLong中,以避免出现synchronization问题.
谢谢!