在 Java 中延迟创建彩色地图

Lazily create a colour map in Java

我创建了一个函数来在 java 中创建颜色图。

final void setDefaultColourMap() {
        colourMap = new HashMap<>();
        colourMap.put(0, Color.BLACK);
        colourMap.put(1, Color.RED);
        colourMap.put(2, Color.GREEN);
        colourMap.put(3, Color.BLUE);
        colourMap.put(4, Color.PINK);
        colourMap.put(5, Color.YELLOW);
        colourMap.put(6, Color.CYAN);
        colourMap.put(7, Color.ORANGE);
        colourMap.put(8, Color.MAGENTA);
        colourMap.put(9, Color.DARK_GRAY);
        colourMap.put(10, Color.WHITE);
        colourMap.put(11, Color.GRAY);
        colourMap.put(12, Color.LIGHT_GRAY);
    }

我想创建一个 java 流,当请求颜色时,它会生成一个新的随机数,并 return 懒惰地生成一个随机颜色。

类似于惰性列表。

编辑:

我读过函数式编程范式支持惰性列表。例如,有一个斐波那契数列的列表,该列表理论上存储列表中的所有元素,但实际上,会在请求时生成第 n 个元素。

我想用一些逻辑来模拟惰性色图。我生成的颜色图只有 13 种颜色的输入。我不想手动输入高达一百左右的值。

我想模拟一个懒人色图。因此,当我请求键为 35 的颜色时,colorMap 是用一些最多 35 的随机颜色制定的,第 35 个值是 returned。

我基本上可以 return 只有 35 并存储它,但理想情况下,如果访问 35,在我的扩展程序中,您可以假设存在最大 35 的值。

这是一个开始:

import java.awt.Color;
import java.util.HashMap;
import java.util.Random;

public class Main {

    public static void main(String[] args) {
        ColorMap map = new ColorMap();
        System.out.println(map.get(19));
        System.out.println(map.get(9));
        System.out.println(map.get(9));
        System.out.println(map.get(0));

        for(int key : map.keySet()){
            System.out.println(key);
        }
    }
}

class ColorMap extends HashMap<Integer, Color>{

    Random rand = new Random();

    @Override
    public Color get(Object key){

        if(! (key instanceof Integer)) return null;

        Color color = super.get(key);
        if(color == null){
            color = makeRandomColor();
            put((Integer) key,color);
        }
        return color;
    }

    private Color makeRandomColor(){
        return new Color( rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
    }
}

编辑: 要填充缺失值,您需要循环并检查所有先前值:

import java.awt.Color;
import java.util.HashMap;
import java.util.Random;

public class Main {

    public static void main(String[] args) {
        ColorMap map = new ColorMap();
        System.out.println(map.get(19));

        for(int key : map.keySet()){
            System.out.println(key);
        }
    }
}

class ColorMap extends HashMap<Integer, Color>{

    Random rand = new Random();

    @Override
    public Color get(Object key){

        if(! (key instanceof Integer)) return null;
        int positiveIntKey = Math.abs((Integer) key);

        Color color = super.get(positiveIntKey);
        if(color == null){
            fillMapUpTo(positiveIntKey);
        }
        return super.get(positiveIntKey);
    }

    private void fillMapUpTo(Integer positiveIntKey) {

        for(int key = 0; key <= positiveIntKey; key++){
            if(super.get(key) == null){
                put(key,makeRandomColor());
            }
        }
    }

    private Color makeRandomColor(){
        return new Color( rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
    }
}