如何使用Java 8进行长函数定义?

时间:2019-05-08 23:12:44

标签: java-8

我有一个对象Product

和下面的代码,hashSetProducts是Products的LinkedHashSet。如何使用Java 8流功能在下面编写所有内容?我知道每次重新命名的价值都会被取代。我需要for循环退出后的最终值。

        int getRemaining(int remaining){
         for(Product P : hashSetProducts){
              remaining = calculate(p.qty(), p.price(), remaining, location); // 
                     use Java 8 stream here
         }   

         return remaining
    }

   private int calculate(int qty, double price, int rem, Location location){
         if(rem== 0){
             return 0;
         }
         int avail = location.get(qty, rem);
         if(avail > 0){
           rem = avail - rem;
         }
        return rem;
    }

1 个答案:

答案 0 :(得分:0)

mapToLong将执行返回long的任意代码。这是一个按原样使用您的计算的MCVE:

import java.util.LinkedHashSet;

public class HelloWorld{

    public static class Product {
        private int qty;
        private double price;
        private int used;

        public Product(int qty, double price, int used) {
            this.qty = qty;
            this.price =price;
            this.used = used;
        }
        public int qty() {return qty;}
        public double price() {return price;}
        public int used() {return used;}
    };

    public static class Location {
        public long get(int qty, int used) { return 0; };
    };

    public static void main(String []args) {

        LinkedHashSet<Product> hashSetProducts = new LinkedHashSet();

        hashSetProducts.add(new Product(1,1.0,1));
        hashSetProducts.add(new Product(2,2.0,2));
        hashSetProducts.add(new Product(3,3.0,3));

        Location location = new Location();

        long remaining = hashSetProducts.stream().mapToLong(p -> {
            int qty = p.qty();
            int used = p.used();

            if( used == 0 )
                return 0;

            long rem = location.get(qty, used);

            if( qty > 0)
                rem = used - rem;

            return rem;
        }).sum();

        System.out.println(remaining);
    }
}