Java:使用供应商在运行时传递值

Java:使用供应商在运行时传递值,java,functional-programming,Java,Functional Programming,我试图解决的问题如中所述 下面的代码正在抛出 SupplyMe.java:18: error: local variables referenced from a lambda expression must be final or effectively final Supplier<String> helloStrSupplier = () -> changingStr; 我该怎么做才能使供应商能够在运行时提供该值?我可以通过这样做使其正常工作 impor

我试图解决的问题如中所述

下面的代码正在抛出

SupplyMe.java:18: error: local variables referenced from a lambda expression must be final or effectively final
        Supplier<String> helloStrSupplier = () -> changingStr;

我该怎么做才能使供应商能够在运行时提供该值?

我可以通过这样做使其正常工作

import java.util.function.Supplier;

 public class SupplyMe {

     public static String changingStr = "";
     private Supplier<String> supplied;

     public SupplyMe(Supplier<String> supplied) {
         this.supplied = supplied;
     }

     public void printSupplied() {
         System.out.println(supplied.get());
     }

     public static void main(String[] args) {

         changingStr = "hi";
         //Supplier<String> helloStrSupplier = changingStr;
         Supplier<String> helloStrSupplier = new DynamicSupplier();

         SupplyMe mySupplyMe = new SupplyMe(helloStrSupplier);


         mySupplyMe.printSupplied();


         changingStr = "hi2";
         mySupplyMe.printSupplied();

     }

     static class DynamicSupplier implements Supplier<String> {
         @Override
         public String get() {
             return changingStr;
         }
     }
 }

这听起来像是一个错误。你到底想做什么?为什么你认为改变供应商提供的价值就能解决问题?@JacobG。我试图解决与supplier相关的问题,而不是其他接口观察者模式。创建额外的类DynamicSupplier没有任何意义,只是为了返回静态字段的值。供应商HellostSupplier=->changingStr;也可以。
import java.util.function.Supplier;

 public class SupplyMe {

     public static String changingStr = "";
     private Supplier<String> supplied;

     public SupplyMe(Supplier<String> supplied) {
         this.supplied = supplied;
     }

     public void printSupplied() {
         System.out.println(supplied.get());
     }

     public static void main(String[] args) {

         changingStr = "hi";
         //Supplier<String> helloStrSupplier = changingStr;
         Supplier<String> helloStrSupplier = new DynamicSupplier();

         SupplyMe mySupplyMe = new SupplyMe(helloStrSupplier);


         mySupplyMe.printSupplied();


         changingStr = "hi2";
         mySupplyMe.printSupplied();

     }

     static class DynamicSupplier implements Supplier<String> {
         @Override
         public String get() {
             return changingStr;
         }
     }
 }