# 1.0.0-Beta7

**BoxLang Betas are released weekly.**

**This is our seventh beta marker and we are incredibly excited of this beta marker since it now fully supports ColdBox for operation.**

## Improvements

### [BL-376](https://ortussolutions.atlassian.net/browse/BL-376) web support error template only shows details of exceptions if IN debug mode else secure by default

If you are using the MiniServer or CommandBox, then if an exception occurs, only in **DEBUG MODE**, will you get the exception stacktrace, details and more. This makes it secure by default of not exposing any potential data for exceptions.

## [BL-392](https://ortussolutions.atlassian.net/browse/BL-392) Consolidate the runtime into services without the need of `getInstance()`

A simple internal improvement to improve locking and instance usage.

## New Features

## [BL-374](https://ortussolutions.atlassian.net/browse/BL-374) threadNew()

This is a new BIF for BoxLang. We have a way to create threads using the `thread{}` component in both script and template, and we have `threadJoin(), threadTerminate()` but we never had a way to create threads functionally.

#### Signature

```java
threadNew( lambda/closure, [attributes={}], [threadName], [priority=normal] )
```

#### Examples

```java
threadNew( () => {
    printLn( "thread is done!" );
    sleep( 1000 );
    result = "done";
} );

threadNew( () => calculateOrder( invoice ), {invoice:myData}, "order-builder", "high" )
```

Please note that the `attributes` is a struct of data that we will bind into the thread's `local` scope.

### [BL-388](https://ortussolutions.atlassian.net/browse/BL-388) Stream type and collector member methods

Java streams are now a native BoxLang type, which for now we don’t try to coerce, but simply match any existing instance or subclass of `java.lang.Stream`. This means we can now add member methods to ANY stream from BoxLang source code and make Streams also dynamic:

* `.toBXArray()`
* `.toBXStruct( [String type] )`
* `.toBXQuery( [Query query] )`
* `.toBXList( [String delimiter] )`

#### Examples

Collect stream of objects into BoxLang array

```java
foods = [ 'apples', 'bananas', 'pizza', 'tacos' ];
result = foods.stream().parallel().toBXArray();

import java.util.stream.IntStream;
result = IntStream.range(1, 6).toBXArray();
```

Collect stream of Map entries into a struct

```java
foods = { 'apples' : 'healthy', 'bananas' : 'healthy', 'pizza' : 'junk', 'tacos' : 'junk' };
result = foods.entrySet()
    .stream()
    .filter( e -> e.getValue() == 'healthy' )
    .toBXStruct();


data = [ 'd' : '', 'c' : '', 'b' : '', 'a' : '' ];
result = data.entrySet().stream().toBXStruct( "sorted" );
```

Collect an array of structs into an existing query object

```java
qry = queryNew( "name,title", "varchar,varchar" );

[
  	{ name: "Brad", title: "Developer" },
  	{ name: "Luis", title: "CEO" },
  	{ name: "Jorge", title: "PM" }
].stream().toBXQuery( qry );
```

Collect a stream of objects into a list

```java
foods = [ 'apples', 'bananas', 'pizza', true ];
foods.stream().toBXList();

[ "www", "google", "com" ].stream().toBXList( "." )
```

### [BL-390](https://ortussolutions.atlassian.net/browse/BL-390) orThrow( type, message ) for attempts

Attempts now allow you to do a custom exception type and message. Check out the [attempt](/boxlang-language/syntax/attempts.md) docs.

### [BL-391](https://ortussolutions.atlassian.net/browse/BL-391) ifSuccessful() alias to ifPresent() on attempts

Attempts now allow you to have an alias to `ifPresent()` that's fluent: `ifSuccessful()`. Check out the [attempt](/boxlang-language/syntax/attempts.md) docs.

## Bugs

[BL-373](https://ortussolutions.atlassian.net/browse/BL-373) Parser detection for unparsed tokens only works if there are 2 or more tokens left

[BL-377](https://ortussolutions.atlassian.net/browse/BL-377) Declaring UDFs in function context doesn't always work

[BL-378](https://ortussolutions.atlassian.net/browse/BL-378) CFConfig datasources aren't importing due to lack of support for the 'dbdriver' key

[BL-379](https://ortussolutions.atlassian.net/browse/BL-379) Runtime can deadlock due to syncronized methods

[BL-380](https://ortussolutions.atlassian.net/browse/BL-380) NPE calling isNumeric()

[BL-381](https://ortussolutions.atlassian.net/browse/BL-381) JSONSerialize() errors when useSecureJSONPrefix not a boolean

[BL-385](https://ortussolutions.atlassian.net/browse/BL-385) Cannot call getWriter(), getOutputStream() already called

[BL-386](https://ortussolutions.atlassian.net/browse/BL-386) empty url vars coming through as null

## Tasks

[BL-372](https://ortussolutions.atlassian.net/browse/BL-372) Create tests for al valid and invalid dot and array access expressions


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://boxlang.ortusbooks.com/readme/release-history/beta-stage/1.0.0-beta7.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
