Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 推理变量在使用.collect(toList()时具有不兼容的边界_Java_Java 8_Java Stream_Collectors - Fatal编程技术网

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());