可以使用stream.mapToObj执行多个语句

时间:2018-01-15 12:10:59

标签: java-8 java-stream

是否可以在mapToObj方法中执行多个语句? 。假设我想使用以下代码将字符串转换为二进制字符串:

 String str = "hello";
 String bin = str.chars()
                  .mapToObj(x-> Integer.toBinaryString(x))
                  .collect(Collectors.joining(" "));

但是,我想用

之类的东西来处理前导零
String.format("%8s", x).replaceAll(" ", "0")

那么,如何在mapToObj方法中添加它。我是Java 8新功能的新手。任何帮助将不胜感激

4 个答案:

答案 0 :(得分:6)

String str = "hello";
String bin = str.chars()
              .mapToObj(x-> Integer.toBinaryString(x))
              .map(str -> String.format("%8s", str).replaceAll(" ", "0"))
              .collect(Collectors.joining(" "));

答案 1 :(得分:6)

您可以使用BigInteger而不是替换空格填充,而是添加' 0'在格式化步骤中。这是有效的,因为BigInteger被视为完整的。

String bin = str.chars()
        .mapToObj(Integer::toBinaryString)
        .map(BigInteger::new)
        .map(x -> String.format("%08d", x))
        .collect(Collectors.joining(" "));

修改

正如@Holger建议使用long而不是BigInteger的解决方案更轻量级,因为Character.MAX_VALUE的二进制表示不超过long的限制。< / p>

String bin = str.chars()
        .mapToObj(Integer::toBinaryString)
        .mapToLong(Long::parseLong)
        .mapToObj(l -> String.format("%08d", l))
        .collect(Collectors.joining(" "));

答案 2 :(得分:3)

您可以在处理二进制字符串的import java.awt.Desktop; import java.io.File; import java.io.IOException; import com.itextpdf.forms.PdfAcroForm; import com.itextpdf.forms.fields.PdfFormField; import com.itextpdf.forms.fields.PdfTextFormField; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.annot.PdfAnnotation; import com.itextpdf.kernel.pdf.annot.PdfWidgetAnnotation; public class problem5 { public static void main(String[] args) throws IOException { String fnPdf = "results/problem5.pdf"; PdfWriter writer = new PdfWriter(fnPdf); PdfDocument pdf = new PdfDocument(writer); PdfPage page = pdf.addNewPage(); PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true); // field PdfTextFormField field = PdfFormField.createText(pdf); field.setFieldName("fName"); // widget 1 Rectangle rect1 = new Rectangle(40, 750, 150, 20); PdfWidgetAnnotation widget1 = new PdfWidgetAnnotation(rect1); widget1.makeIndirect(pdf); widget1.setFlag(PdfAnnotation.PRINT); page.addAnnotation(widget1); field.addKid(widget1); // widget 2 Rectangle rect2 = new Rectangle(240, 750, 150, 20); PdfWidgetAnnotation widget2 = new PdfWidgetAnnotation(rect2); widget2.makeIndirect(pdf); widget2.setFlag(PdfAnnotation.PRINT); page.addAnnotation(widget2); field.addKid(widget2); // field field.setValue("Dirk"); form.addField(field, page); // ---- pdf.close(); Desktop.getDesktop().open(new File(fnPdf)); } } 之后调用.map()函数,例如:

.mapToObject()

答案 3 :(得分:3)

当然可以。它甚至不需要带有多个语句的lambda表达式。

String bin = str.chars()
                .mapToObj(x-> String.format("%8s", Integer.toBinaryString(x)).replaceAll(" ", "0"))
                .collect(Collectors.joining(" "));