# HG changeset patch # User jlaskey # Date 1537292992 10800 # Tue Sep 18 14:49:52 2018 -0300 # Node ID 5351c18b9b7f25172da5441dad759864b8f5d723 # Parent ccea318862aef53cb145933cd11a78845b2da353 8203442: String::transform Reviewed-by: smarks, rriggs, sherman diff --git a/src/java.base/share/classes/java/lang/String.java b/src/java.base/share/classes/java/lang/String.java --- a/src/java.base/share/classes/java/lang/String.java +++ b/src/java.base/share/classes/java/lang/String.java @@ -37,6 +37,7 @@ import java.util.Objects; import java.util.Spliterator; import java.util.StringJoiner; +import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -2972,6 +2973,25 @@ } /** + * This method allows the application of a function to {@code this} + * string. The function should expect a single String argument + * and produce an {@code R} result. + * + * @param f functional interface to a apply + * + * @param class of the result + * + * @return the result of applying the function to this string + * + * @see java.util.function.Function + * + * @since 12 + */ + public R transform(Function f) { + return f.apply(this); + } + + /** * This object (which is already a string!) is itself returned. * * @return the string itself. diff --git a/test/jdk/java/lang/String/Transform.java b/test/jdk/java/lang/String/Transform.java new file mode 100644 --- /dev/null +++ b/test/jdk/java/lang/String/Transform.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary Unit tests for String#transform(Function f) + * @run main Transform + */ + +import java.util.function.Function; +import java.util.stream.Collectors; + +public class Transform { + public static void main(String[] args) { + test1(); + } + + /* + * Test String#transform(Function f) functionality. + */ + static void test1() { + simpleTransform("toUpperCase", "abc", s -> s.toUpperCase()); + simpleTransform("toLowerCase", "ABC", s -> s.toLowerCase()); + simpleTransform("substring", "John Smith", s -> s.substring(0, 4)); + + String multiline = " This is line one\n" + + " This is line two\n" + + " This is line three\n"; + String expected = "This is line one!\n" + + " This is line two!\n" + + " This is line three!\n"; + check("multiline", multiline.transform(string -> { + return string.lines() + .map(s -> s.substring(4) + "!") + .collect(Collectors.joining("\n", "", "\n")); + }), expected); + } + + static void simpleTransform(String test, String s, Function f) { + check(test, s.transform(f), f.apply(s)); + } + + static void check(String test, Object output, Object expected) { + if (output != expected && (output == null || !output.equals(expected))) { + System.err.println("Testing " + test + ": unexpected result"); + System.err.println("Output:"); + System.err.println(output); + System.err.println("Expected:"); + System.err.println(expected); + throw new RuntimeException(); + } + } +}