Java 8 - Kleines Beispiel zu Lambda-Ausdrücken mit try-with-Resources

Thomas Darimont

Erfahrenes Mitglied
Hallo,

hier mal ein kleines Beispiel dazu wie man in Java 8 - Lambda Ausdrücke mit try-with Resources Konstrukten kombinieren kann:
Java:
package de.tutorials.training;


import java.util.function.Consumer;
import java.util.function.UnaryOperator;


interface ResourceFactory<R extends Resource> {
    R create();
}


class ResourceProcessor<R extends Resource> {
    public ResourceProcessor(ResourceFactory<R> factory, Consumer<R> consumer) {
        try (R res = factory.create()) {
            consumer.accept(res);
        }
    }
}


class Resource implements AutoCloseable {
    public void op1() {
        System.out.printf("op1 %s %n", this);
    }


    public void op2() {
        System.out.printf("op2 %s %n", this);
    }


    @Override
    public void close() {
        System.out.printf("close %s %n", this);
    }


    public static void use(Consumer<Resource> block) {
        try (Resource resource = new Resource()) {
            block.accept(resource);
        }
    }
}


public class ResourceHandling {
    public static void main(String[] args) {


        //Beispiel 1: Try-with resources Konstrukt aus Java 7
        try (Resource resource = new Resource()) {
            resource.op1();
            resource.op2();
        }


        System.out.println("###");


        //Beispiel 2: Spezifikation der Verarbeitung einer Resource als Lambda-Ausdruck (in Kombination mit try-with Resource)
        Resource.use(res -> {
            res.op1();
            res.op2();
        });


        System.out.println("###");


        //Beispiel 3: Spezifikation einer ResourceFactory als Lambda-Ausdruck
        new ResourceProcessor<Resource>(() -> new Resource(), (res) -> {
            res.op1();
            res.op2();
        });
    }
}

Ausgabe:
Code:
op1 de.tutorials.training.Resource@2f0e140b 
op2 de.tutorials.training.Resource@2f0e140b 
close de.tutorials.training.Resource@2f0e140b 
###
op1 de.tutorials.training.Resource@7699a589 
op2 de.tutorials.training.Resource@7699a589 
close de.tutorials.training.Resource@7699a589 
###
op1 de.tutorials.training.Resource@568db2f2 
op2 de.tutorials.training.Resource@568db2f2 
close de.tutorials.training.Resource@568db2f2


Gruß Tom
 
Hey Tom,

vielen Dank für den Code (und nebenbei auch für alles Andere, was du hier im Forum organisierst, das ist echt klasse!)
Allerdings bin ich mir ehrlich gesagt nicht ganz sicher, ob ich den Sinn dieser Neuerung verstehe :rolleyes:
Wann kann man so etwas mal gebrauchen? Ich mag Java ja, aber für mich sieht das so aus, als hätte Sun wieder versucht, etwas von C++ zu übernehmen, und sich damit total verrannt :D
Belehre mich bitte eines besseren, wenn möglich ^.^

Schöne Grüße,
Cymatoxa
 
Zurück