Java 推理变量在使用.collect(toList()时具有不兼容的边界
任务是: 修改姓名以字母表后半部分的字母开头的所有员工的奖金Java 推理变量在使用.collect(toList()时具有不兼容的边界,java,java-8,java-stream,collectors,Java,Java 8,Java Stream,Collectors,任务是: 修改姓名以字母表后半部分的字母开头的所有员工的奖金 主类 { 公共静态void main(字符串[]str){ 经理账单=新经理(“账单”,2010,2549,空); 经理史蒂文=新经理(“史蒂文”,2011年,2100年,比尔); 培训师jerry=新培训师(“jerry”,2014,800,steven); RegWorker john=新的RegWorker(“john”,2010,1000,bill); RegWorker kate=新的RegWorker(“kate”,2
主类
{
公共静态void main(字符串[]str){
经理账单=新经理(“账单”,2010,2549,空);
经理史蒂文=新经理(“史蒂文”,2011年,2100年,比尔);
培训师jerry=新培训师(“jerry”,2014,800,steven);
RegWorker john=新的RegWorker(“john”,2010,1000,bill);
RegWorker kate=新的RegWorker(“kate”,2011,1000,比尔);
RegWorker sam=新的RegWorker(“sam”,2013,1200,steven);
最终列表工人=Arrays.asList(jerry、john、kate、sam);
System.out.println(“修改所有正式员工的奖金:”);
RegWorker reg=null;
列表regWorkers=workers
.stream()
.filter(w->w.getClass()==reg.getClass())
.filter(w->w.getName().charAt(0)<'O')
.map(w->w.setBonus(w,w.getBonus(w)+3))
.collect(toList());
}
我有这个 原因:推理变量T的边界不兼容
相等约束:RegWorker
下限:浮点
在执行
map
时,将流对象替换为mapper函数返回值,该值是setBonus
的返回值,它是float。因此在map
步骤之后,您没有stream
,而是stream
,应该将其收集到列表中
似乎您希望使用peek
而不是map
。此外,您还需要将流元素强制转换到RegWorker
类,因为原始流是stream
。最后请注意,您的代码还有另一个问题,将在运行时出现:reg.getClass()
将抛出NullPointerException
,因为reg
为空。可能您只需要.filter(w->w RegWorker实例)
:
List regWorkers=workers
.stream()
.filter(w->w RegWorker实例)
.filter(w->w.getName().charAt(0)<'O')
.map(w->(RegWorker)w)
.peek(w->w.setBonus(w,w.getBonus(w)+3))
.collect(toList());
代码太多,而且也很奇怪:reg.getClass()
肯定会因NullPointerException而失败。为什么不在同一行上组合这两个过滤器呢。@Jean-FrançoisSavard,这是品味的问题。@Tagirvalev这不是增加了时间复杂性吗?@Jean-FrançoisSavard,在测量之前你永远不会知道。看。移动.filter(w->w.getName()).charAt(0)<'O')
到链的开头提高了性能,因为字符比较比instanceof
便宜,并且将步骤.filter(w->w instanceof RegWorker)
和.map(w->(RegWorker)w)
靠得更近会增加它们通过热点融合在一起的机会。然而,这都是推测性的,而且只与趋势有关。很可能整个操作会作为单个代码块进行优化,然后所有差异都可以忽略不计。
class Worker that extends Employee
{
public Worker(String name, int yOfEmp, int salary, Manager boss){
super(name, yOfEmp, salary,boss);
boss.addEmployee(this);
}
public float getBonus(Employee emp){
Random rand = new Random();
float proc = rand.nextFloat();
return emp.getSalary() * proc;
}
public float setBonus(Employee e, float proc){
float newProc = proc;
return e.getSalary() * proc;
}
@Override
public String toString() {
return super.toString();
}
}
class RegWorker extends Worker
{
}
class Main
{
public static void main(String[] str) {
Manager bill = new Manager("Bill", 2010, 2549, null);
Manager steven = new Manager("Steven", 2011, 2100, bill);
Trainer jerry = new Trainer("Jerry", 2014, 800, steven);
RegWorker john = new RegWorker("John", 2010, 1000, bill);
RegWorker kate = new RegWorker("Kate", 2011, 1000, bill);
RegWorker sam = new RegWorker("Sam", 2013, 1200, steven);
final List<Worker> workers = Arrays.asList(jerry, john, kate, sam);
System.out.println("Modify bonuses for all regular workers:");
RegWorker reg = null;
List<RegWorker> regWorkers = workers
.stream()
.filter(w -> w.getClass() == reg.getClass())
.filter(w -> w.getName().charAt(0) < 'O')
.map(w -> w.setBonus(w, w.getBonus(w)+3))
.collect(toList());
}
List<RegWorker> regWorkers = workers
.stream()
.filter(w -> w instanceof RegWorker)
.filter(w -> w.getName().charAt(0) < 'O')
.map(w -> (RegWorker)w)
.peek(w -> w.setBonus(w, w.getBonus(w)+3))
.collect(toList());