在 Java-8 中使用函数的 ArrayList [英] Working with an ArrayList of Functions in Java-8

查看:31
本文介绍了在 Java-8 中使用函数的 ArrayList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题描述:我希望能够使用从另一个类传入的函数 ArrayList(函数已在该其他类中定义).如果在一个类中定义了可能具有不同输入和返回类型的函数列表,我希望能够将其中一些函数的 ArrayList(可能有重复项)作为参数传递给其他类的构造函数或方法和使用它们执行操作.

Problem Description: I want to be able to use an ArrayList of Functions passed in from another class (where the Functions have been defined in that other class). If the list of Functions, which may have different input and return types, are defined in one class, I want to be able to pass an ArrayList of some of them, with possible duplicates, as a parameter to some other class's constructor or method and perform operations using them.

代码说明:下面的代码是一个大大简化的示例,从设计的角度来看,它没有多大意义.问题的重点是 SomeClass 中的方法 getResult() 以及通常如何使用函数的 ArrayList 一旦拥有它们.

Code Description: The code below is a greatly simplified example which is not intended to make much sense from a design perspective. The focus of the problem is the method getResult() within SomeClass and generally how to use an ArrayList of Functions once you have them.

尝试解决问题:getResult() 方法实现是使用 Function 列表的众多尝试之一.同样,请不要介意代码的设计.这样做是为了尽量使问题示例尽可能短.

Attempt to solve the problem: The getResult() method implementation is an example of one of many attempts to use the Function list. Again, please don't mind the design of the code. It was just done that way to try to make the problem example as short as possible.

简单的测试类

package com.Testing;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.function.Function;

public class Tester {

    public static void main(String[] args)
    {
        // Some functions
        Function<Integer, Integer> increment = (Integer input) -> {
            return input + 1;
        };

        Function<Integer, Integer> decrement = (Integer input) -> {
            return input - 1;
        };

        Function<Double, Double> timesPi = (Double input) -> {
            return input * 3.14;
        };

        // list of Functions
        List<Function> availableMathOperations = new ArrayList<>();
        List<Function> selectedMathOperations = new ArrayList<>();

        // populate master list
        availableMathOperations.add(increment);
        availableMathOperations.add(decrement);
        availableMathOperations.add(timesPi);

        // Populate random selection list //
        //    generate random binary number
        Random randomGenerator = new Random();
        int randomNumber = randomGenerator.nextInt(availableMathOperations.size() * 2);
        boolean[] bits = new boolean[availableMathOperations.size()];
        for (int j = 0; j < availableMathOperations.size(); j++) {
            bits[availableMathOperations.size() - 1 - j] = (1 << j & randomNumber) != 0;
        }

        // add math operations to selectedMathOperations based on binary number
        for (int j = 0; j < bits.length; j++) {
            if (bits[j]){
                selectedMathOperations.add(availableMathOperations.get(j));
            }
        }

        SomeClass someClass = new SomeClass(selectedMathOperations, 1.23);

    }
}

其他类

package com.Testing;

import java.util.List;
import java.util.function.Function;

public class SomeClass {

    List<Function> operations;
    double initialValue;

    public SomeClass(List<Function> newOperations, double newInitialValue){
        operations = newOperations;
        initialValue = newInitialValue;
    }

    public double getResult(){
        double result = 0.0;

        // problem method
        // perform the random list of operations using the initial value initially
        for(int i = 0; i < operations.size(); i++){
            if(i == 0)
                result = operations.get(i)(initialValue);
            else
                result += operations.get(i)(result);
        }
        return result;
    }

}

推荐答案

java.util.function.Function 对象是 apply.你需要这样称呼它:

The method of a java.util.function.Function object is apply. You need to call it like this:

operations.get(i).apply(initialValue)

然而,您使用原始 Function,因此结果可能是 Object,您需要将其转换为适当的类型.此外,您不能将 +(或 +=)运算符与它一起使用.我建议使用 Number 限制参数类型:

However you use raw Function and therefore the result could be Object and you'd need to convert it to the appropriate type. Also you can't use the + (or the +=) operator with it. I'd suggest restricting the parameter types with Number:

List<Function<Number, ? extends Number>> operations = Arrays.asList(
        num ->  num.intValue() + 1,
        num -> num.intValue() - 1,
        num -> num.doubleValue() * 3.14
        ); // just an example list here 

public double getResult() {
    double result = 0.0;

    for (int i = 0; i < operations.size(); i++) {
        if (i == 0) {
            result = operations.get(i).apply(initialValue).doubleValue();
        } else {
            result += operations.get(i).apply(result).doubleValue();
        }
    }
    return result;
}

这篇关于在 Java-8 中使用函数的 ArrayList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆